我正在开发一个Rails应用程序,从Sprockets迁移到Webpack。我们当前的JavaScript依赖于全局分配在
我们有几个JavaScript包,为了提高性能,它们已经被手动拆分:
我的配置文件包括
window
上的库。为了迁移,我想保持全局分配,直到我们稍后再处理它。我想在没有任何JavaScript更改的情况下从Sprockets切换到Webpack。我们有几个JavaScript包,为了提高性能,它们已经被手动拆分:
core.js
,其中包含jQuery和其他一些文件。这是一个阻塞包。vendor.js
,其中包含所有其他库和jQuery插件。这是一个延迟包。application.js
,其中包含我们自定义的应用程序代码。也是一个延迟包。
application.js
依赖于vendor.js
。这对于Sprockets来说很好,但在Webpack中会出现问题。
如何在Webpack中将jQuery保留在core.js
中,但将其从vendor.js
和application.js
中排除?或者另一种方式是如何在多个Webpack包之间共享同一个jQuery实例?我需要使用相同的实例,因为application.js
依赖于在vendor.js
中定义的jQuery插件。我的配置文件包括
expose-loader
和ProvidePlugin
,但这些会将jQuery包含在包内本身,这不是同一个实例。换句话说,我正在多次打包jQuery(这可以用splitChunks()
来解决),但我不能保证我使用的是哪个实例,因此无法保证插件可用。// Webpacker environment.js config
const { environment } = require('@rails/webpacker');
const path = require('path');
const webpack = require('webpack');
environment.loaders.append('expose', {
test: require.resolve('jquery'),
use: [
{
loader: 'expose-loader',
options: 'jQuery'
},
{
loader: 'expose-loader',
options: '$'
}
]
});
environment.plugins.append(
'Provide',
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
);
module.exports = environment;
splitChunks
绝对是我们未来想要使用的东西,但这还需要一些时间。即使如此,由于它是唯一的阻塞JS,我们可能仍然希望将core.js
作为自己的捆绑包。通过将defer:true
添加到其他捆绑包中,我们大约获得了2秒的性能提升,我们不太愿意失去它 :)看起来我可能正在寻找多个配置。 - bholtbholtcore.js
中的JS是你的“initial” chunk。不用一个带有延迟属性defer
的单独打包文件来存储其余部分,你可以从初始chunk中简单地使用动态导入,例如import('../application')
。在这种情况下,application.js
将不是一个独立的打包文件,即将其移出app/javascript/packs
文件夹;它应该成为你的core.js
打包文件的异步依赖项。 - rosstasplitChunks
设计的目的。您不想制作明确的捆绑包,而是让Webpack为您完成工作。 - rossta