关于node.js:aws +无服务器+ webpack =>在产品中找不到模块xxx

aws + serverless + webpack => cannot find module xxx in prod

我想创建一个程序包以使用无服务器和webpack部署在AWS上。

serverless.yml中,我想声明所有资源(主要是DynamoDb表)和函数。 我想使用外部node.js库。

文件夹结构为:

1
2
3
4
5
6
|- serverless.yml
|- webpack.config.js
|- package.json
|- src
  \\ - file1.js
  | - file2.js

从serverless.yml中提取

1
2
3
4
5
functions:
  function1:
    handler: src/file1.f1
  function2:
    handler: src/file2.f2

从webpack.congfig.js中提取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module.exports = {
  entry: {
    file1: './src/file1.js',
    file2: './src/file2.js',
  },
  target: 'node',
  output: {
    libraryTarget: 'commonjs',
    path: path.join(__dirname, '.webpack'),
    filename: '[name].js',
  },
  module: {
    loaders: [
      {
        test: /\\.json$/,
        loaders: ['json-loader'],
      },
    ],
  },
};

进行serverless deploy时一切正常,但是在测试lambda时出现错误:

1
2
3
4
5
6
7
8
9
{
 "errorMessage":"Cannot find module '/var/task/src/file1'",
 "errorType":"Error",
 "stackTrace": [
   "Function.Module._load (module.js:276:25)",
   "Module.require (module.js:353:17)",
   "require (internal/module.js:12:17)"
  ]
}

你能告诉我我在做什么错吗?

鉴于我是无服务器的新手,您能为我推荐一些有关代码和开发组织的"更好的实践"吗? (强加了无服务器和nodejs,webpack和其他都没有)


我建议使用无服务器Webpack插件。在看不到整个serverless.yml文件的情况下很难分辨,但是我认为无服务器正在尝试部署functions:下列出的功能,在您的情况下,这些功能是用Node.js 4.3运行时无法理解的语法编写的AWS Lambda。

Serverless Stack详细介绍了如何使用serverless-webpack插件建立项目的过程:

  • 设置无服务器框架
  • 添加对ES6 JavaScript的支持

  • 检查节点版本

    node --version

    Run

    serverless plugin install --name serverless-webpack


    该错误的一种可能解决方案是从serverless.yml文件中的函数的处理程序中删除src/

    这种方法的副作用是,当使用serverless-mocha-plugin自动创建测试时,不再考虑src/,必须在const mod = require('../src/user.js');中手动添加它。

    可能还有其他副作用,没有证据就是没有证据! :)

    因此,我仍在寻找没有副作用的解决方案。