Javascript 使用webpack在运行时动态要求JS文件

Javascript 使用webpack在运行时动态要求JS文件,javascript,requirejs,webpack,Javascript,Requirejs,Webpack,我试图将一个库从grunt/requirejs移植到webpack,但偶然发现了一个问题,这可能是这项工作的一个破坏者 我尝试移植的库有一个函数,它根据我们从配置文件获得的多个模块的文件名,将多个模块加载并计算到我们的应用程序中。代码如下所示(咖啡): 这里的require需要在运行时调用,并像requireJS那样运行。Webpack似乎只关心“构建过程”中发生的事情 这是webpack根本不关心的事情吗?如果是这样,我还可以使用requireJS吗?在运行时动态加载资产的好解决方案是什么 编

我试图将一个库从grunt/requirejs移植到webpack,但偶然发现了一个问题,这可能是这项工作的一个破坏者

我尝试移植的库有一个函数,它根据我们从配置文件获得的多个模块的文件名,将多个模块加载并计算到我们的应用程序中。代码如下所示(咖啡):

这里的
require
需要在运行时调用,并像requireJS那样运行。Webpack似乎只关心“构建过程”中发生的事情

这是webpack根本不关心的事情吗?如果是这样,我还可以使用requireJS吗?在运行时动态加载资产的好解决方案是什么


编辑:loadModule可以加载此库生成时不存在的模块。它们将由实现我的库的应用程序提供

有一个名为
context
()的概念,它允许进行动态请求

还可以定义代码拆分点:

并按如下方式使用:

loadModules(arrayOfFiles).then(function(){
    modules.forEach(function(module){
        module(moduleAPI);
    })
});

但这可能不是您所需要的-您将拥有大量的块,而不是一个包含所有必需模块的捆绑包,而且它可能不是最优的

最好在配置文件中定义模块需求,并将其包含到构建中:

// modulesConfig.js
module.exports = [
   require(...),
   ....
]

// run.js
require('modulesConfig').forEach(function(module){
    module(moduleAPI);
})

所以我发现我的要求是在运行时加载一些文件,这些文件只在“应用程序编译时”上可用,而在“库编译时”上不可用,这在webpack中是不容易实现的

我将改变机制,这样我的库不再需要文件,而是需要传递所需的模块。多少告诉我,无论如何,这将是一个更好的API

编辑以澄清:

基本上,不是:

# in my library
load = (path_to_file) ->
  (require path_to_file).do_something()

# in my app (using the 'compiled' libary)
cool_library.load("file_that_exists_in_my_app")
我这样做:

# in my library
load = (module) ->
  module.do_something()

# in my app (using the 'compiled' libary)
module = require("file_that_exists_in_my_app")
cool_library.load(module)
第一个代码在require.js中工作,但不在webpack中


事后看来,我觉得让第三方库在运行时加载文件是非常错误的。

您也可以尝试使用如下库:


免责声明:我是它的开发者。我之所以写这篇文章,是因为我对无法在运行时自由访问模块内容感到沮丧。(在我的情况下,用于从控制台进行测试)

谢谢您的回答。我不能使用上下文,因为这些动态加载的模块似乎需要在构建时出现。我的图书馆不是这样的。它们只有在应用程序本身构建完成后才可用,而不是我的库。为什么这个答案被否决了?我需要做和这个问题的作者完全相同的事情,而且也没有找到一种方法来做,上下文只在构建时存在所需的文件时才起作用。为了更清晰,我编辑了解决方案。希望这对解决方案没有解决问题有帮助!!!!,如何使此代码在运行时运行:“require(pathToFile+fileName);”当pathToFile或/和fileName仅在运行时计算时????Gil,请重新考虑使用感叹号;)
require(pathToFile+fileName)
为您获取文件,如果您运行
webpack
时该文件可用。如果它在编译时不可用,但稍后会可用(例如,当您的库加载到项目中时,这些文件就存在),那么您需要重新考虑“require”策略。请再读一遍答案。也许你有不同的问题?我对Cordova也有类似的问题,它使用非标准的AMD加载器,但我的应用程序是使用webpack构建的。我的应用程序依赖于一些Cordova插件,这些插件在运行时加载,在编译时不存在。我尝试了许多解决办法,但没有一个对我有吸引力。我希望看到“运行时”依赖项的本机网页包模块解析。原则上,实施应该很容易。某个工厂函数,当其他模块需要该模块时,将调用该函数(并返回运行时定义的某个对象/函数)。将功能请求添加到网页包。
# in my library
load = (path_to_file) ->
  (require path_to_file).do_something()

# in my app (using the 'compiled' libary)
cool_library.load("file_that_exists_in_my_app")
# in my library
load = (module) ->
  module.do_something()

# in my app (using the 'compiled' libary)
module = require("file_that_exists_in_my_app")
cool_library.load(module)