Webpack 5 (Webpack Encore):如何在同一页面上运行多个 webpack 实例并避免任何冲突?

Posted

技术标签:

【中文标题】Webpack 5 (Webpack Encore):如何在同一页面上运行多个 webpack 实例并避免任何冲突?【英文标题】:Webpack 5 (Webpack Encore): How to run multiple webpack instances on the same page and avoid any conflicts? 【发布时间】:2021-08-05 01:31:59 【问题描述】:

对于一个相当大的 Web 应用程序,我想在同一页面上运行多个 Webpack (Encore) 实例。当我将所有源代码放入一个 Webpack 配置中时,它就可以工作了。但是,当我使用相同的源代码有两种不同的配置时,我总是会遇到这样的错误:

lib.84f46ab6.js:19 Uncaught TypeError: __webpack_require__.n is not a function
    at Object../assets/js/lib.js (lib.84f46ab6.js:19)
    at __webpack_require__ (bootstrap:19)
    at __webpack_exec__ (codemirror.css?f2af:1)
    at codemirror.css?f2af:1
    at Function.__webpack_require__.O (chunk loaded:25)
    at codemirror.css?f2af:1
    at webpackJsonpCallback (jsonp chunk loading:36)
    at Array.forEach (<anonymous>)
    at jsonp chunk loading:49
    at runtime.7c0b88c9.js:146

经过一番研究,我在这里找到了一篇关于这个问题的文章:https://medium.com/@cliffers/how-to-run-multiple-webpack-instances-on-the-same-page-and-avoid-any-conflicts-4e2fe0f016d1

它基本上说:

Webpack 不在全局命名空间中运行……所以是什么导致了 问题?它使用了一个名为 CommonsChunkPlugin 的 webpack 插件 用于通过 JSONP 按需加载代码的 ansyc。插件注册 并使用一个名为 window.webpackJsonp 的全局函数,这就是 发生冲突。

只需将 webpackJsonp 函数的名称更改为至少一个 在 webpack 实例上运行并解决了冲突。

但是他们已经在 Webpack 5 中删除了这个功能,我仍然无法弄清楚如何正确配置它。有人知道如何使用最新版本的 Webpack Encore(当前为 1.1.2)解决这个问题吗?

我的部分配置:

// ...
const libConfig = Encore.getWebpackConfig();

// ...

// build the second configuration
const appConfig = Encore.getWebpackConfig();

appConfig.name = 'appConfig';

// Export the final configuration
module.exports = [libConfig,appConfig]

Encore中基本是这样配置多种配置的:https://symfony.com/doc/current/frontend/encore/advanced-config.html

【问题讨论】:

【参考方案1】:

最后我通过在配置中添加以下设置来解决它:

appConfig.output.chunkLoadingGlobal = 'appConfigChunkLoadingGlobal'

就这么简单。它确保用于加载块的全局 Webpack 函数对于两个配置没有相同的名称。它是旧的webpackJsonp 函数的替代品。

【讨论】:

以上是关于Webpack 5 (Webpack Encore):如何在同一页面上运行多个 webpack 实例并避免任何冲突?的主要内容,如果未能解决你的问题,请参考以下文章

Sass 加载器无法使用 Encore webpack 和 Symfony 5 加载 url

使用 TailwindCSS 和 Symfony Webpack Encore

Symfony 4 - Webpack-encore 使用 FosJsRouting :路由未定义

Webpack x Symfony 5 - 未定义 JQuery

我无法通过 symfony/webpack-encore 使用 Jest 和 Vuejs 运行测试

如何在 Symfony 项目中使用 jQuery 和 webpack-encore?