webpack 动态模块加载器通过 require

新手上路,请多包涵

好的,我搜索了高低,但无法可靠地确定 webpack 是否可行。

https://github.com/webpack/webpack/tree/master/examples/require.context 似乎表明可以将字符串传递给函数并加载模块…

但我的尝试只是行不通:webpack.config.js

 'use strict';
let webpack     = require('webpack'),
    jsonLoader  = require("json-loader"),
    path        = require("path"),
    fs          = require('fs'),
    nodeModules = {};

fs.readdirSync('node_modules')
    .filter(function(x) {
        return ['.bin'].indexOf(x) === -1;
    })
    .forEach(function(mod) {
        nodeModules[mod] = 'commonjs ' + mod;
    });

let PATHS = {
    app: __dirname + '/src'
};

module.exports = {
    context: PATHS.app,
    entry: {
        app: PATHS.app+'/server.js'
    },
    target: 'node',
    output: {
        path: PATHS.app,
        filename: '../build/server.js'
    },
    externals: nodeModules,
    performance: {
        hints: "warning"
    },
    plugins: [
        jsonLoader
    ],
    resolve: {
        modules: [
            './node_modules',
            path.resolve(__dirname),
            path.resolve(__dirname + "/src"),
            path.resolve('./config')
        ]
    },
    node: {
        fs: "empty"
    }
};

服务器.js

 let _ = require('lodash');
let modules = [ "modules/test" ];

require( 'modules/test' )();

_.map( modules, function( module ){
    require( module );
});

modules/ 中名为 test.js 的模块

module.exports = () => {
    console.log('hello world');
};

但结果总是一样的…… pm2 日志只是为静态要求说你好世界…… 但对于同一模块的动态加载

错误:找不到模块“。”

我想要做的就是循环遍历模块的路径数组然后加载……

原文由 user1037355 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

您不能将变量用作 require 的参数。 Webpack 需要知道在编译时要打包哪些文件。由于它不进行程序流分析,因此无法知道您传递给函数的内容。在那种情况下,它可能是显而易见的,但这可能会使用用户输入来决定需要什么模块,并且 webpack 不可能知道在编译时要包含哪些模块,因此 webpack 不允许这样做。

您发布的示例有点不同。您可以将 require 与串联字符串一起使用。例如:

 require(`./src/${moduleName}/test`);

webpack 需要在 bundle 中包含哪些模块?变量 moduleName 可以是任何东西,所以在编译时不知道确切的模块。相反,它包括可能匹配上述表达式的 所有 模块。假设以下目录结构:

 src
├─ one
│   └─ test.js
├─ two
│   ├─ subdir
│   │   └─ test.js
│   └─ test.js
└─ three
    └─ test.js

All of these test.js files will be included in the bundle, because moduleName could be one or something nested like two/subdir .

有关更多详细信息,请参阅官方文档的 require with expression

您不能遍历数组并导入数组的每个模块,除了上述通过连接字符串的例外情况,但这具有包括所有可能模块的效果,通常应避免。

原文由 Michael Jungo 发布,翻译遵循 CC BY-SA 3.0 许可协议

我在电子环境中遇到了这个问题。我的用例能够 require 在类似 IDE 的应用程序中动态创建文件。我想使用电子 require ,它基本上是一个 NodeJS 通用模块加载器。经过一番反复之后,我找到了一个使用 webpack 的 noParse 模块配置的解决方案。

首先创建一个将被 webpack 的解析器忽略的模块:

 // file: native-require.js
// webpack replaces calls to `require()` from within a bundle. This module
// is not parsed by webpack and exports the real `require`
// NOTE: since the module is unparsed, do not use es6 exports
module.exports = require

在我的 webpack 配置中,在 module 下,指示捆绑器不要解析此模块:

 {
  module: {
    noParse: /\/native-require.js$/,
  }
}

最后,在您想要访问原始需求的任何包中:

 import nativeRequire from './native-require'
const someModule = nativeRequire('/some/module.js') // dynamic imports

原文由 Josiah Ruddell 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏