Javascript 有没有办法用Webpack在异步块中用全局变量替换所需的包?
我想要什么: 所有要求jQuery包含它的JavaScript/TypeScript文件,但所有要求jQuery不包含jQuery的异步块都使用Javascript 有没有办法用Webpack在异步块中用全局变量替换所需的包?,javascript,jquery,webpack,dependencies,chunks,Javascript,Jquery,Webpack,Dependencies,Chunks,我想要什么: 所有要求jQuery包含它的JavaScript/TypeScript文件,但所有要求jQuery不包含jQuery的异步块都使用window.jQuery变量 问题: 问题是:有一个jQuery插件(外部代码)作为块加载,需要在其代码(UMD)中使用jQuery,因此块本身在Webpack构建后包含自己的jQuery…:( 上下文: 我有一个主文件,它导入jQuery并使它作为一个全局窗口在遗留代码中可用。然后这个主文件将异步加载一些块 其中一个区块是一个外部包(因此我无法更改代
window.jQuery
变量
问题:
问题是:有一个jQuery插件(外部代码)作为块加载,需要在其代码(UMD)中使用jQuery,因此块本身在Webpack构建后包含自己的jQuery…:(
上下文:
我有一个主文件,它导入jQuery并使它作为一个全局窗口在遗留代码中可用。然后这个主文件将异步加载一些块
其中一个区块是一个外部包(因此我无法更改代码),它是一个用UMD编写的jQuery插件
看起来有点像:
// main.js
import $ from 'jquery';
window.$ = window.jQuery = $; // In reality with expose-loader.
import(/* webpackChunkName: jquery.plugin */ 'jquery-plugin').then(() => {
$('element').plugin();
});
插件的UMD如下所示:
// jquery-plugin.js
(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Webpack gets here by default.
define(['jquery'], factory);
} else if (typeof exports === 'object' && typeof require === 'function') {
// Webpack gets here if I disable AMD in Webpack config.
factory(require('jquery'));
} else {
// I would like Webpack to get here.
factory(jQuery); // Browser global
}
}(function($) { /* plugin code */ })
我的尝试:
我看到了webpack.ProvidePlugin
,但它似乎只适用于所有文件,因此我的main.js将不包含jQuery,这将是一个大问题
使用
webpack.IgnorePlugin
忽略特定库中的jQuery,但会导致模块未找到错误,因为该文件不再包含jQuery,但jQuery插件代码没有更改,仍然需要jQuery
// webpack.config.js
{
plugins: [
new webpack.IgnorePlugin(/^jquery$/, /node_modules\/jquery-plugin/),
]
}
jquery.autocomplete.js:19未捕获(承诺中)错误:找不到
模块“jquery”
据我所知,我不能使用
externals
作为对象,因为它对所有文件都是外部的。因此我尝试使用函数syntax,但没有成功。我觉得这可能是解决方案,但我缺少一些东西:
// webpack.config.js
{
externals: [
function(context, request, callback) {
if (/^jquery$/.test(request) && /node_modules\/jquery-plugin/.test(context)){
return callback(null, 'amd ' + request);
}
callback();
},
],
}
外部jquery:1未捕获(承诺中)引用错误:未定义网页外部模块638
也许有一些splitChunk选项可以处理类似的事情
IDK:'( 非常欢迎您的帮助^^' 谢谢 海默斯