我的lambda函数的Webpack捆绑包具有require语句(实际上不是捆绑包)

问题描述 投票:0回答:2

所以这是一个很奇怪的人。我正在使用Webpack捆绑(并构建)一些用TypeScript编写的lambda函数,但是lambda无法运行,因为Webpack输出的“捆绑包”实际上并未捆绑在一起。它们仍然包含本地定义的TypeScript模块/帮助程序的'require'语句。

我确定我缺少一些愚蠢的东西,但是我一定会很感谢您的帮助!

tsconfig

{
  "compilerOptions": {
    "module": "commonjs",
    "allowJs": true,
    "noEmit": false,
    "esModuleInterop": true,
    "noImplicitAny": false,
    "strictNullChecks": false,
    "isolatedModules": false,
    "resolveJsonModule": true,
  },
  "exclude": [],
  "include": [
    "src/lambda"
  ],
  "ts-node": {
    "compilerOptions": {
      "module": "commonjs"
    }
  }
}

webpack.config.ts

import * as webpack from 'webpack';
import * as path from 'path';
import nodeExternals from 'webpack-node-externals';

const handler = (percentage: number, message: string) => {
  // eslint-disable-next-line no-console
  console.log(`${(percentage * 100).toFixed()}% ${message}`);
};

module.exports = {
  entry: {
    api: ['./src/lambda/api.ts']
  },
  node: {
    fs: 'empty',
  },
  resolve: {
    extensions: ['.js', '.ts', '.tsx', '.scss'],
  },
  output: {
    libraryTarget: 'commonjs',
    path: path.resolve('./build/'),
    filename: '[name].js',
  },
  target: 'node',
  externals: [nodeExternals()],
  module: {
    noParse: /node_modules/,
    rules: [
      {
        test: [/\.ts$/, /\.tsx$/],
        exclude: /(node_modules)/,
        use: [
          {
            loader: 'ts-loader',
            options: {
              configFile: 'tsconfig.lambda.json',
            },
          },
        ],
      },
    ],
  },
  plugins: [new webpack.ProgressPlugin(handler)],
};

api.ts

import { helper } from './api/helper';

export const handler = (event, context, callback) => {
  callback(null, {
    statusCode: 400,
    body: helper(),
  });
};

api/helper.ts

export const helper = () => {
  return 'Hello World';
};


webpack output

!function(e,r){for(var t in r)e[t]=r[t]}(exports,function(e){var r={};function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var o in e)t.d(n,o,function(r){return e[r]}.bind(null,o));return n},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=0)}([function(e,r,t){e.exports=t(1)},function(e,r){"use strict";r.__esModule=!0,r.handler=void 0;var t=require("./api/helper");r.handler=function(e,r,n){n(null,{statusCode:400,body:t.helper()})}}]));

注意在函数结尾处的require("./api/helper")。为什么不拉入? 为什么在“捆绑的”输出中有一个require语句?捆绑软件中不应该包括helper函数吗?

谢谢!

node.js webpack lambda bundler
2个回答
1
投票

一堆内部软件包可以确定范围,但是:

var _packageName = require('package-name');

通过查看package.json name字段,当它确实为require('@scope/package-name')时在编译版本中吐出。在Webpack 4.17及更低版本上,此错误针对范围内的应用程序发生。应该将其安装到@scope/package-name模块中,否则无法将其读取到build(捆绑包)。


1
投票

这里的问题是以下行:

module: {
    noParse: /node_modules/, // < --- this guy breaks everything
    rules: [
      {
        test: [/\.ts$/, /\.tsx$/],
        exclude: /(node_modules)/,
        use: [
          {
            loader: 'ts-loader',
            options: {
              configFile: 'tsconfig.lambda.json',
            },
          },
        ],
      },
    ],
  },

删除noParse,一切都会按预期进行,exclude: /(node_modules)/就足够了。

UPD:我不知道为什么noParse会在您的应用中导致此类Webpack行为。 Here是处理noParse的地方。

© www.soinside.com 2019 - 2024. All rights reserved.