node.js - 我的 lambda 函数的 Webpack 包有 require 语句(实际上并没有 bundle )

标签 node.js webpack lambda bundler

所以这是一个非常奇怪的问题。我正在使用 Webpack bundle (并构建)一些用 TypeScript 编写的 lambda 函数,但是 lambda 无法运行,因为 Webpack 输出的“bundle ”实际上并未 bundle 。它们仍然包括本地定义的 TypeScript 模块/帮助程序的“要求”语句。

我确定我错过了一些愚蠢的东西,但我当然会很感激帮助!
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")接近函数的末尾。为什么拉不进去?? 为什么“bundle ”输出中有要求语句? 辅助函数不应该包含在包中吗?

谢谢!

最佳答案

这里的问题是以下行:

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)/足够。

更新 : thb 我不知道为什么 noParse在您的应用程序中导致此类 webpack 行为。 HerenoParse的地方处理。

关于node.js - 我的 lambda 函数的 Webpack 包有 require 语句(实际上并没有 bundle ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62316745/

相关文章:

node.js - VSCode 调试 (F5) React 应用程序给出 SyntaxError : Unexpected identifier

node.js - Backbone.js 和 Node.js : Looking for a best practice for application settings

vue.js - Bundle size 很大,如何减小 app.js 的大小?

javascript - Breeze.js 和 WebPack

c++ - 为什么这个 lambda [=] 捕获会创建多个拷贝?

scala - 使用Java库的Scala,利用Java 8中的lambda表达式支持

c# - 无法将 lambda 表达式转换为类型 'object',因为它不是委托(delegate)类型

javascript - NodeJS socket.io 抛出错误“连接在收到握手响应之前已关闭”

node.js - 在 Express 4.x 中包含 API 路由

reactjs - 如何在 gatsby 中初始化 firebase?