medikoo / serverless-plugin-reducer

Serverless plugin: Reduce Node.js lambda package so it contains only lambda dependencies
ISC License
14 stars 5 forks source link

Breaks when knex.js in package.json #6

Closed vedantroy closed 2 years ago

vedantroy commented 4 years ago

Bug Report

Description

  1. What did you do? Ran serverless package
  2. What happened? The lambda was successfully packaged. But, I get a runtime error when trying to require knex (I think).
internal/modules/cjs/loader.js:895
    throw err;
    ^

Error: Cannot find module './dialects/postgres/index.js'
Require stack:
- C:\Users\<my username>\Desktop\app\node_modules\knex\lib\knex.js
- C:\Users\<my username>\Desktop\app\node_modules\knex\lib\index.js
- C:\Users\<my username>\Desktop\app\node_modules\knex\knex.js
- C:\Users\<my username>\Desktop\app\src\database.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:892:15)       
    at Function.Module._load (internal/modules/cjs/loader.js:785:27)
    at Module.require (internal/modules/cjs/loader.js:956:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Knex (C:\Users\<my username>\Desktop\app\node_modules\knex\lib\knex.js:43:15)
    at Object.<anonymous> (C:\Users\<my username>\Desktop\app\src\database.js:2:33)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1103:10)
    at Module.load (internal/modules/cjs/loader.js:914:32)
    at Function.Module._load (internal/modules/cjs/loader.js:822:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1143:12)
    at internal/main/run_main_module.js:16:11 {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    'C:\\Users\\<my username>\\Desktop\\app\\node_modules\\knex\\lib\\knex.js',
    'C:\\Users\\<my username>\\Desktop\\app\\node_modules\\knex\\lib\\index.js',
    'C:\\Users\\<my username>\\Desktop\\app\\node_modules\\knex\\knex.js',
    'C:\\Users\\<my username>\\Desktop\\app\\src\\database.js'
  ]
}
  1. What should've happened? No runtime error
  2. What's the content of your serverless.yml file?
    
    service: <my service name>

provider: name: aws runtime: nodejs12.x

package:

Unclear if this setting does anything, since I have 1 function

individually: true exclude:

functions: app: handler: src/api.serverless events:

  1. What's the output you get when you use the SLS_DEBUG=* environment variable (e.g. SLS_DEBUG=* serverless deploy)

I can include it, but I don't think it would be helpful?

I am using this plugin because I have a bunch of other modules in my package.json that I don't want to include in the final lambda. These modules will be used by local.js for various purposes.

medikoo commented 4 years ago

Issue is that knex does dynamic requires, which cannot be picked normally via static analysis.

To workaround that, you need to ensure ignoreMissing: true option for reducer, and ensure that modules which are eventually picked by dynamic resolution are taken via include option.

I'm closing this, but do not hesitate to ask more questions if needed