如何配置webpack的自动代码拆分以相对于构建输出文件夹加载模块?

时间:2017-02-12 17:03:18

标签: javascript webpack webpack-2

我正在使用Webpack 2的自动代码拆分将我的应用程序分成多个输出文件。我的webpack.config.js文件是:

const path = require('path');

module.exports = {
  entry: './app.js',
  output: {
    filename: '[name].js',
    path: path.join(__dirname, 'build'),
  }
}

这正确地将我的app.js文件与其他模块文件一起构建到build文件夹中。构建目录包含以下文件:

main.js
0.js

我的问题是,当main.js请求0.js时,它会在我的应用程序的根目录中执行,而不是相对于其当前位置。因此,当它应该加载localhost:8000/0.js时,它基本上会尝试加载localhost:8000/build/0.js。如何配置项目以便我的项目相对于主入口点的路径正确加载拆分模块?

2 个答案:

答案 0 :(得分:2)

默认情况下,Webpack将从根目录加载模块。您可以通过在入口点声明__webpack_public_path__变量来配置Webpack将加载的文件夹。因此,对于这种情况,您可以使用:

__webpack_public_path__ = 'build/';
然后,Webpack将从build文件夹加载模块。然而,这仍然是相对于根。为了告诉Webpack加载相对于入口点的脚本,您可以使用以下命令动态配置__webpack_public_path__到入口点脚本的目录:

const scriptURL = document.currentScript.src;
__webpack_public_path__ = scriptURL.slice(0, scriptURL.lastIndexOf('/') + 1);

document.currentScriptwell supported in evergreen browsers,但在Internet Explorer中不受支持。

答案 1 :(得分:0)

更新:

如果您有多个入口点,代码拆分主要起作用,在这种情况下,您可以按需加载部分代码。 (例如在requestidlecallback或setTimeout中,并不重要。)

但是,如果您不想为/上的设置加载逻辑,但希望将其加载到/settings,则通常会将其用于路由。

所以你可以添加像

这样的东西
// goes to `/settings`
button.addEventListener('click', () => {
  require.ensure([], () => {
    require('./settings')
  })
})

您检查过require.ensure()吗?

  

webpack在构建时静态解析代码中的require.ensure(),并将模块添加到单独的块中。这个新的块由webpack通过jsonp按需加载。

https://webpack.js.org/guides/code-splitting-require/#require-ensure-