一尘不染

webpack动态模块加载器按需

node.js

好的,我已经搜索了高低位,但是无法可靠地确定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"
    }
};

server.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日志只是向静态需求打个招呼世界…但是对于同一个模块的动态负载

错误:找不到模块“。”

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


阅读 495

收藏
2020-07-07

共1个答案

一尘不染

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

您发布的示例有些不同。您可以使用require串联字符串。例如:

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

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

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

所有这些test.js文件都将包含在捆绑包中,因为moduleName可能是one或类似嵌套的东西two/subdir

有关更多详细信息,请参阅带有官方文档表达require

您无法遍历一个数组并导入该数组的每个模块,但上述例外情况是无法通过串联字符串来进行导入,但是这样做的结果是包括了所有可能的模块,通常应避免这样做。

2020-07-07