如何让 "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/pluginsapp/main.js

中显示了一个示例

最后,运行 npm run build.

可以将所有内容捆绑到 js/bundle.js