【发布时间】:2020-03-11 21:32:23
【问题描述】:
我正在使用 Rails 应用程序,从 Sprockets 迁移到 Webpack。我们当前的 JavaScript 依赖于全局分配给 window 的库。为了迁移过来,我想保持全局分配,直到我们以后解决它。我想在不更改任何 JavaScript 的情况下从 Sprockets 切换到 Webpack。
我们有几个 JavaScript 包,为了提高性能而手动拆分:
-
core.js,其中包含 jQuery 和其他几个文件。这是一个阻塞包。 -
vendor.js,包含所有其他库和 jQuery 插件。这是一个延迟捆绑包。 -
application.js,其中包含我们的自定义应用程序代码。也是一个延迟捆绑包。
所有的bundle都依赖于jQuery,application.js依赖于vendor.js。这对 Sprockets 来说很好,但对于 Webpack 来说是个问题。
如何将 jQuery 保留在 core.js 中,但将其从 Webpack 中的 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;
【问题讨论】:
标签: jquery ruby-on-rails webpack sprockets