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



所以这是一个非常奇怪的问题。我正在使用 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 语句?帮助程序函数不应该包含在捆绑包中吗?

谢谢!

这里的问题是以下行:

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: thb 我不知道为什么noParse会导致您的应用程序中出现这种 webpack 行为。这是noParse处理的地方。

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

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

在编译版本中吐出,而实际上应该通过查看 package.json 名称字段来require('@scope/package-name')它。

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

相关内容

最新更新