如何告诉 webpack 忽略节点模块,包括核心模块和从 npm 安装的模块?

Tom*_*ica 4 amazon-web-services node.js npm webpack babeljs

我需要打包一个用 webpack 编写的模块并用 babel 进行转译。但是我不想打包任何东西node_modules。另外,Node.js 核心模块不应打包。

我收到核心模块的这些错误:

ERROR in ./node_modules/tunnel-agent/index.js
Module not found: Error: Can't resolve 'net' in '...project path...\node_modules\tunnel-agent'
 @ ./node_modules/tunnel-agent/index.js 3:10-24
 @ ./node_modules/request/lib/tunnel.js
 @ ./node_modules/request/request.js
 @ ./node_modules/request/index.js
Run Code Online (Sandbox Code Playgroud)

很明显,webpack 正在抓取节点模块,这是我不想要的。它还显然尝试加载诸如net和 之类的模块fs等模块。

如何阻止这种情况,并且只打包和转译我自己的代码?

我的配置:

const path = require('path');
module.exports = {
    entry: './serverless_function.js',
    output: {
        path: path.resolve('dist'),
        filename: 'serverless_packed.js'
    },
    module: {
        loaders: [
            { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ },
            { test: /\.jsx$/, loader: 'babel-loader', exclude: /node_modules/ }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要打包我的无服务器函数,以便与在 Amazon AWS 上运行的 Node.js 6 兼容。它看起来像这样:

const Library = require("./MyLibrary");
const fs = require("fs");

async function serverlessFunction(event, context, callback) {
    const response = {
        statusCode: 200,
        headers: {

            "Content-Type": "image/png",
            "Content-Disposition": "inline; filename=\"something.png\""
        },
        body: await Library.createImage().asBase64String("param1", "param2"),
        isBase64Encoded: true
    };
    return callback(null, response);
}

module.exports = { serverlessFunction };
Run Code Online (Sandbox Code Playgroud)

Nat*_*end 5

您可以使用该模块webpack-node-externals来完成此操作:

const path = require('path');
const nodeExternals = require('webpack-node-externals');

module.exports = {
    entry: './serverless_function.js',
    output: {
        path: path.resolve('dist'),
        filename: 'serverless_packed.js'
    },

    // in order to ignore built-in modules like path, fs, 
    target: 'node',

    // in order to ignore all modules in node_modules folder 
    externals: [nodeExternals()],

    module: {
        loaders: [
            { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ },
            { test: /\.jsx$/, loader: 'babel-loader', exclude: /node_modules/ }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)