【问题标题】:Webpack bundle imports with an @带有 @ 的 Webpack 包导入
【发布时间】:2020-04-18 19:41:18
【问题描述】:

我正在尝试使用 Webpack 捆绑使用 TypeScript 构建的 Node Express 服务器。

编译/转译成一个 JavaScript 文件 server.js 效果很好,但该文件似乎没有包含所有必要的导入。如果文件在dist/server.js 中并且node_modules/... 中仍然有Node 模块,那么使用node dist/server.js 启动服务器效果很好。但是,如果我将 server.js 复制到任何其他位置而不复制 Node 模块,然后启动它,它不会找到使用 @ 导入的类。

可能的错误:

mysystem:Desktop myuser$ node server.js 
internal/modules/cjs/loader.js:582
    throw err;
    ^

Error: Cannot find module '@overnightjs/core'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:580:15)
    at Function.Module._load (internal/modules/cjs/loader.js:506:25)
    at Module.require (internal/modules/cjs/loader.js:636:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at Object.<anonymous> (/Users/myuser/Desktop/server.js:1:1422)
    at a (/Users/myuser/Desktop/server.js:1:172)
    at Object.<anonymous> (/Users/myuser/Desktop/server.js:1:6473)
    at a (/Users/myuser/Desktop/server.js:1:172)
    at Object.<anonymous> (/Users/myuser/Desktop/server.js:1:6233)
    at a (/Users/myuser/Desktop/server.js:1:172)

我认为我的 Webpack 配置文件中可能缺少一些内容,即:

const path = require('path');
const nodeExternals = require('webpack-node-externals');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
    entry: "./src/start.ts",
    output: {
        filename: "server.js",
        path: path.resolve(__dirname, "dist")
    },

    node: {
      // Need this when working with express, otherwise the build fails
      __dirname: false,   // if you don't put this is, __dirname
      __filename: false,  // and __filename return blank or /
      fs: 'empty',
    },

    resolve: {
        alias: {},
        // Add '.ts', and '.tsx' as resolvable exteensions.
        extensions: [".ts", ".tsx", ".js", ".json"]
    },

    externals: [nodeExternals()], // Need this to avoid error when working with Express

    module: {
        rules: [
            // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.
            { test: /\.tsx?$/, loader: "awesome-typescript-loader" },

            // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
            { enforce: "pre", test: /\.js$/, loader: "source-map-loader" }
        ]
    },

    plugins: [
        new CleanWebpackPlugin({
            cleanAfterEveryBuildPatterns: ['dist']
        })
    ]
};

我使用的版本:

  • 节点 (v10.13.0)
  • 纱线 (1.7.0)
  • Express (4.17.1)
  • TypeScript (3.7.4)
  • Webpack (4.41.4)
  • Webpack-CLI (3.3.10)

如何在 Webpack 的包中添加以 @ 开头的导入?

【问题讨论】:

    标签: node.js typescript express webpack import


    【解决方案1】:

    这是有道理的,您的 externals 配置告诉 webpack 不要将 node_modules 捆绑到包中,而是在运行时需要它们。

    这意味着如果你没有将 node_modules 复制到新位置,它会尝试要求它,并且会失败。

    通常最好不要在创建节点包时捆绑 node_modules。

    你有两个选择:

    1. 删除 externals 配置 - 会增加包大小,因为它将包含您的应用正在使用的所有 node_modules。
    2. 在您的新位置安装新的node_modules,如果此位置是生产环境,您可以使用npm install --production,它将仅安装依赖项没有 devDependencies。

    【讨论】:

      【解决方案2】:

      在转译 TypeScript 时不要捆绑模块。标准做法是在您部署服务器的任何地方使用两个下载模块。如果您已完成开发,请确保使用生产标志。 npm i --production

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-01
        • 2015-11-10
        • 2016-12-03
        相关资源
        最近更新 更多