如何让 "require('jquery')" 在 webpack 中自动加载许多 jquery plugins/extensions?
How to make "require('jquery')" automatically load with many jquery plugins/extensions in webpack?
我希望 jquery 自动拥有许多插件。在常规站点中,我会按顺序简单地包含 jquery 和脚本。我如何使用 webpack 完成此操作?假设插件没有 npm 包,我只想从文件中加载它们。
我将采用以下目录结构:
project
|- app
| |- vendor
| | |- plugins
| | | |- plugin-1.js
| | | |- plugin-2.js
| | | |- ...
| | |
| | |- jquery.js
| |
| |- jquery-with-plugins.js
| |- main.js
|
|- js
| |- bundle.js
|
|- webpack.config.js
|- package.json
...
下面是关键文件的内容:
// app/jquery-with-plugins.js
require('vendor/jquery');
req = require.context('vendor/plugins', true, /\.js$/);
req.keys().forEach(function (plugin) {
req(plugin);
});
module.exports = jQuery;
// app/main.js
var $ = require('jquery');
$(function () {
$('.selector-1').use_plugin_1();
$('.selector-2').use_plugin_2();
});
// webpack.config.js
var path = require('path');
module.exports = {
context: path.join(__dirname, 'app'),
entry: './main',
output: {
path: path.join(__dirname, 'js'),
filename: 'bundle.js'
},
module: {
loaders: [
{
test: /\.js$/,
include: [
path.join(__dirname, 'app/vendor')
],
loader: 'script'
}
]
},
resolve: {
alias: {
'jquery$': path.join(__dirname, 'app/jquery_with_plugins'),
'vendor': path.join(__dirname, 'app/vendor')
}
},
extensions: ['', '.js']
};
// package.json
{
"name": "temp",
"version": "0.0.0",
"private": true,
"scripts": {
"build": "webpack --progress --colors"
},
"devDependencies": {
"node-libs-browser": "^0.5.0",
"script-loader": "^0.6.1",
"webpack": "^1.9.4"
}
}
app/vendor
目录中的每个 JavaScript 文件都已配置为使用 script-loader 加载,因此将在全局上下文中执行。在 app/jquery-with-plugins.js
中,我首先加载 jQuery
,然后在导出 jQuery
时加载每个插件(N.B。 我不必须导出 jQuery
因为它已经全局公开,但我认为从现在开始使用 CommonJS 模块更好。)每个插件都已经附加到 jQuery 对象。
我给 jquery
添加了别名以引用 app/jquery-with-plugins.js
(请参阅 resolve.alias
配置),因此我可以通过简单地执行 jQuery 与所有插件一起使用 require('jquery')
。更好的是,为了能够添加插件并立即使用它,您只需将其添加到 app/vendor/plugins
。 app/main.js
中显示了一个示例
最后,运行 npm run build
.
可以将所有内容捆绑到 js/bundle.js
我希望 jquery 自动拥有许多插件。在常规站点中,我会按顺序简单地包含 jquery 和脚本。我如何使用 webpack 完成此操作?假设插件没有 npm 包,我只想从文件中加载它们。
我将采用以下目录结构:
project |- app | |- vendor | | |- plugins | | | |- plugin-1.js | | | |- plugin-2.js | | | |- ... | | | | | |- jquery.js | | | |- jquery-with-plugins.js | |- main.js | |- js | |- bundle.js | |- webpack.config.js |- package.json ...
下面是关键文件的内容:
// app/jquery-with-plugins.js
require('vendor/jquery');
req = require.context('vendor/plugins', true, /\.js$/);
req.keys().forEach(function (plugin) {
req(plugin);
});
module.exports = jQuery;
// app/main.js
var $ = require('jquery');
$(function () {
$('.selector-1').use_plugin_1();
$('.selector-2').use_plugin_2();
});
// webpack.config.js
var path = require('path');
module.exports = {
context: path.join(__dirname, 'app'),
entry: './main',
output: {
path: path.join(__dirname, 'js'),
filename: 'bundle.js'
},
module: {
loaders: [
{
test: /\.js$/,
include: [
path.join(__dirname, 'app/vendor')
],
loader: 'script'
}
]
},
resolve: {
alias: {
'jquery$': path.join(__dirname, 'app/jquery_with_plugins'),
'vendor': path.join(__dirname, 'app/vendor')
}
},
extensions: ['', '.js']
};
// package.json
{
"name": "temp",
"version": "0.0.0",
"private": true,
"scripts": {
"build": "webpack --progress --colors"
},
"devDependencies": {
"node-libs-browser": "^0.5.0",
"script-loader": "^0.6.1",
"webpack": "^1.9.4"
}
}
app/vendor
目录中的每个 JavaScript 文件都已配置为使用 script-loader 加载,因此将在全局上下文中执行。在 app/jquery-with-plugins.js
中,我首先加载 jQuery
,然后在导出 jQuery
时加载每个插件(N.B。 我不必须导出 jQuery
因为它已经全局公开,但我认为从现在开始使用 CommonJS 模块更好。)每个插件都已经附加到 jQuery 对象。
我给 jquery
添加了别名以引用 app/jquery-with-plugins.js
(请参阅 resolve.alias
配置),因此我可以通过简单地执行 jQuery 与所有插件一起使用 require('jquery')
。更好的是,为了能够添加插件并立即使用它,您只需将其添加到 app/vendor/plugins
。 app/main.js
最后,运行 npm run build
.
js/bundle.js