我的 lambda 函数的 Webpack 包有 require 语句(实际上没有包)

Webpack bundle of my lambda function has require statements (doesn't actually bundle)

所以这很奇怪。我正在使用 Webpack 捆绑(和构建)一些用 TypeScript 编写的 lambda 函数,但 lambda 无法 运行 因为 Webpack 输出 'bundles' 实际上并未捆绑。它们仍然包含用于本地定义的 TypeScript modules/helpers.

的 '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")。怎么没拉进去?? 为什么 'bundled' 输出中有 require 语句? 辅助函数不应该包含在包中吗?

谢谢!

一堆内部包可以限定范围但是:

var _packageName = require('package-name');
通过查看 package.json 名称字段,

在编译版本中吐出它实际上应该是 require('@scope/package-name')

在 Webpack 4.17 及以下版本中,作用域应用程序会发生此错误。它应该安装到 @scope/package-name 模块中,否则无法读取以构建(捆绑)。

这里的问题是下面一行:

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 行为。 HerenoParse处理的地方。