Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript (网页包)如何分块动态模块依赖项_Javascript_Webpack_Commonschunkplugin - Fatal编程技术网

Javascript (网页包)如何分块动态模块依赖项

Javascript (网页包)如何分块动态模块依赖项,javascript,webpack,commonschunkplugin,Javascript,Webpack,Commonschunkplugin,我刚刚意识到,如果您使用require.sure()动态加载模块,webpack将不会同时分析和分块依赖项。这在某种程度上是有道理的,有人可能会争辩说,webpack不知道这些模块是否被转移过,但我们能强迫webpack做这项工作吗 例如: app.js: require.ensure([ 'module1.js' ], ( require ) => { // at some point require( 'module1.js' ); }, 'Module1'); re

我刚刚意识到,如果您使用
require.sure()
动态加载模块,webpack将不会同时分析和分块依赖项。这在某种程度上是有道理的,有人可能会争辩说,webpack不知道这些模块是否被转移过,但我们能强迫webpack做这项工作吗

例如:

app.js

require.ensure([ 'module1.js' ], ( require ) => {
    // at some point
    require( 'module1.js' );
}, 'Module1');

require.ensure([ 'module2.js' ], ( require ) => {
    // at some point
    require( 'module2.js' );
}, 'Module2');
module1.js

let io = require( 'socket.io-client' );
let io = require( 'socket.io-client' );
module2.js

let io = require( 'socket.io-client' );
let io = require( 'socket.io-client' );
编译的结果是,这两个模块都将整个套接字io库“链接”到它们的块中。我最初的期望是,CommonChunkPlugin将捕获那些
需要的
,并将那个大库放入一个公共块中

new webpack.optimize.CommonsChunkPlugin( 'common' ),

但是,这不起作用。当然,我总是可以手动“解决”这个依赖关系,但我希望webpack能以某种方式解决这个问题。

到目前为止,我找到了一个可能的解决方案。 如果您使用webpack的
require.include()
方法仅在父模块app.js中包含(而不是计算)“共享库,此处为socket.io客户端”,CommonChunkPlugin现在将能够正确地排序

require.include( 'socket.io-client' ); // import io from 'socket.io-client'; also works
require.ensure([ 'module1.js' ], ( require ) => {
    // at some point
    require( 'module1.js' );
}, 'Module1');

require.ensure([ 'module2.js' ], ( require ) => {
    // at some point
    require( 'module2.js' );
}, 'Module2');

然而,这对我来说似乎并不正确,因为这是一个手动解析依赖项的过程,而这实际上并不是我想用Webpack之类的东西来完成的

答案隐藏在的配置中

子项:true
是此配置的主要部分。 从文档:

如果为true,则选择commons区块的所有子级


编辑异步公共块 如果您想异步下载区块中的通用代码,您应该更改上述配置,添加
async:true

new webpack.optimize.CommonsChunkPlugin({
  name: 'main',
  children: true, 
  minChunks: 2, 
  async: true, // modification
});
从关于
async
的文档中:

如果为true,将创建一个新的异步公用块作为options.name的子级 和options.chunk的兄弟。它是并行加载的 选项。块。可以更改输出文件的名称 通过提供所需的字符串而不是true

现在,根据您的示例创建了仅包含
socket.io客户端的额外块。

这与中的原始示例非常接近。

Doe在
CommonChunkPlugin选项中将
minChunks
设置为
2
更改情况?不幸的是,没有。啊,我真的希望是这样,但事实证明,这在这种情况下没有帮助。如果我打开
children:true
,所有发生的事情就是我的“公共”区块现在与
主捆绑包链接在一起了。但它不会影响动态加载的bundle。两者仍然将共享库/require链接到各自的区块中。
async:true
完成任务了吗?没有区别。这两个模块仍然链接到每个模块的相同套接字io库。我在Webpack2.1.0-beta.20上测试所有内容,这几乎是最新的。哦,我展示了最新稳定v1.13.2索引的答案,它成功了。除了
children:true
之外,它还创建了预期的行为(将套接字io库链接到主块中)。我以为name属性里面只是一些随机id分别设置了输出文件名。。。现在谢谢你,那可能也会让赏金落空。