Javascript 按要求加载Web包动态模块

Javascript 按要求加载Web包动态模块,javascript,node.js,webpack,require,webpack-2,Javascript,Node.js,Webpack,Require,Webpack 2,好的,我已经上下搜索过了,但无法可靠地确定这是否适用于webpack 似乎表示可以将字符串传递给函数并加载模块 但我的尝试不起作用: webpack.config.js 'use strict'; let webpack = require('webpack'), jsonLoader = require("json-loader"), path = require("path"), fs = require('fs'),

好的,我已经上下搜索过了,但无法可靠地确定这是否适用于webpack

似乎表示可以将字符串传递给函数并加载模块

但我的尝试不起作用: 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/name test.js中的模块

module.exports = () => {
    console.log('hello world');
};
但结果总是一样的。。。pm2日志只需为静态请求向世界问好。。。但对于同一模块的动态负载

错误:找不到模块“”


我想要做的就是通过一系列路径循环到模块,然后加载

不能将变量用作
要求的参数。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
的嵌套文件

有关更多详细信息,请参阅官方文件


你不能循环一个数组并导入数组中的每个模块,上面的例外是通过连接一个字符串,但这样做会包含所有可能的模块,通常应该避免。

有点晚了……但是。。。由于您要绑定到
目标:'node'
,因此有一个解决方案,可以解决动态需要模块的问题,并绕过“包含所有可能模块的影响”

解决方案来自:

引述该评论:

const requireFunc = typeof __webpack_require__ === "function" ? __non_webpack_require__ : require;
const foo = requireFunc(moduleName);
捆绑到:

const requireFunc = true ? require : require;
const foo = requireFunc(moduleName);

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

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

//文件:native-require.js
//webpack替换捆绑包中对“require()”的调用。本模块
//未被webpack解析并导出真正的'require'`
//注意:由于模块未解析,因此不要使用es6导出
module.exports=require
在我的网页包配置中的
模块下
,指示捆绑程序不要解析此模块:

{
  module: {
    noParse: /\/native-require.js$/,
  }
}
最后,在要访问原始文件的任何捆绑包中,需要:

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

如果能在网页文档中清楚地解释这一点就好了。非常感谢你,我感谢你澄清这一点,特别是对根本原因的详细描述。根据一般做法,您对如何加载文件以供显示有何建议?我对React编程和任何严肃的编程都是非常陌生的,所以大致了解什么样的设计模式适合我会很好,这样我可以进一步研究它们。谢谢。有没有办法让webpack捆绑package.json中的每个模块?(当然,除非需要其中一个,否则它不会全部加载到客户端浏览器上)这个解决方案对我来说效果很好,有几个调整:1。要访问,我必须使用:
import nativeRequire=require('./native require')
。它抱怨模块没有默认的导出。2.要导出全局require,我必须在native-require.js中使用:
module.exports=require
。这是因为我没有定义
global.require
(节点10.13,网页4.29)