【问题标题】:jQuery with Webpack 2带有 Webpack 2 的 jQuery
【发布时间】:2023-03-16 22:55:02
【问题描述】:

我的 webpack.config.js 如下所示:

var debug = process.env.NODE_ENV !== "production";
var webpack = require('webpack');
var path = require('path');
var node_dir = __dirname + '/node_modules';
const autoprefixer = require('autoprefixer');
const ProvidePlugin = require('webpack/lib/ProvidePlugin');

module.exports = {
  context: path.join(__dirname, "src"),
  devtool: debug ? "inline-sourcemap" : null,
  entry: ['tether',
    'font-awesome-loader',"bootstrap-loader","./js/client.js"],
  resolve: {
    extensions: ['.js', '.styl'],
    alias: {
      'jquery': node_dir + '/jquery/src/jquery.js',
    }
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /(node_modules|bower_components)/,
        loader: 'babel-loader',
        query: {
          presets: ['react', 'es2015', 'stage-0'],
          plugins: ['react-html-attrs', 'transform-decorators-legacy', 'transform-class-properties'],
        }
      },
      { test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] },
      { test: /\.scss$/, use: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader'] },
      {
        test: /\.woff2?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
        use: 'url-loader?limit=10000',
      },
      {
        test: /\.(ttf|eot|svg)(\?[\s\S]+)?$/,
        use: 'file-loader',
      },
      {
      test: /\.styl$/,
      use: [
        'style-loader',
        'css-loader',
        {
          loader: 'stylus-loader',
          /*options: {
            use: [stylus_plugin()],
          },*/
        },
      ],
    },
      // Use one of these to serve jQuery for Bootstrap scripts:

      // Bootstrap 4
      { test: /bootstrap\/dist\//, use: 'imports-loader?jQuery=jquery' },
    ]
  },
  output: {
    path: __dirname + "/dist/",
    filename: "client.min.js"
  },
  plugins:  [
    //new webpack.optimize.DedupePlugin(),
    //new webpack.optimize.OccurenceOrderPlugin(),
    new webpack.optimize.UglifyJsPlugin({ mangle: false, sourcemap: false }),
    new webpack.ProvidePlugin({
      $: "jquery",
      jQuery: "jquery",
      "window.jQuery": "jquery",
      Tether: "tether",
      "window.Tether": "tether",
      Alert: "exports-loader?Alert!bootstrap/js/dist/alert",
      Button: "exports-loader?Button!bootstrap/js/dist/button",
      Carousel: "exports-loader?Carousel!bootstrap/js/dist/carousel",
      Collapse: "exports-loader?Collapse!bootstrap/js/dist/collapse",
      Dropdown: "exports-loader?Dropdown!bootstrap/js/dist/dropdown",
      Modal: "exports-loader?Modal!bootstrap/js/dist/modal",
      Popover: "exports-loader?Popover!bootstrap/js/dist/popover",
      Scrollspy: "exports-loader?Scrollspy!bootstrap/js/dist/scrollspy",
      Tab: "exports-loader?Tab!bootstrap/js/dist/tab",
      Tooltip: "exports-loader?Tooltip!bootstrap/js/dist/tooltip",
      Util: "exports-loader?Util!bootstrap/js/dist/util",
    }),
    new webpack.LoaderOptionsPlugin({
      postcss: [autoprefixer],
    })
  ],
};
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>React, Babel, Webpack 2</title>
  </head>
  <body class="container">
    <div id="app"></div>
    <script src="jquery.timeago.js"></script>
    <script src="client.min.js"></script>
    
  </body>
</html>

但是当我尝试使用 jQuery.timeago() 函数时,我遇到了错误。

我正在关注 React By Example 一书。当我输入 window.jQuery 时,我在 jQuery 之后出现了一些奇怪的数字。但是当我只输入 jQuery 时,我会变得不确定。由于 bootstrap 4 和 $.ajax() 正在工作,我确信 jQuery 已包含在内,但不确定 jQuery 为何显示未定义。

谁能解释一下 jQuery 是如何被包含在内的以及我做错了什么。

【问题讨论】:

    标签: jquery webpack-2


    【解决方案1】:

    将插件添加到 webpack 配置的插件部分,如下所示:

    var webpack = require('webpack')
    ...
    
    plugins: [
      new webpack.ProvidePlugin({
        $: 'jquery',
        jQuery: 'jquery',
      })
    ]
    

    编辑:

    你有循环依赖:

    timeago: jquery
    client: timeago jquery
    

    jqueryclient 是同一个捆绑包。尝试像这样在 html 中切换包含 js 包:

    <script src="client.min.js"></script>
    <script src="jquery.timeago.js"></script>
    

    代替:

    <script src="jquery.timeago.js"></script>
    <script src="client.min.js"></script>
    

    如果这没有帮助,或者您有其他错误,您需要将 jquery 提取到单独的包中,并将其包含在 timeago 之前。另一种方法是包含 jquery 就像来自 cdn 的老派一样,并让 webpack 像这样知道:

    externals: {
      jquery: 'jQuery'
    }
    

    要将 jquery 提取到单独的包并使其对 timeago 可见,请使用如下所示的包含序列:

    <script src="common.js"></script>
    <script src="jquery.timeago.js"></script>
    <script src="client.min.js"></script>
    

    并像这样使用 webpack 通用块插件:

    entry: {
      common: ["jquery"],
      ...
    },
    plugins: [
      new webpack.optimize.CommonsChunkPlugin({
        name: "common",
        filename: "common.js",
        minChunks: Infinity,
      })
    ],
    

    【讨论】:

    • 嗨。如果你看到我的 webpack.config.js 文件,我已经这样做了。但我仍然不确定。
    • 我扩展了一个答案。希望你会成功。
    • 嗨。我更改了脚本标签的顺序。不工作。您能否解释一下“您需要将 js 提取到单独的捆绑包并在 timeago 之前包含它”。我是 webpack 的新手。
    • 我解释了一些例子。我希望你会成功。
    猜你喜欢
    • 1970-01-01
    • 2018-09-01
    • 2017-12-08
    • 2017-07-03
    • 2017-08-29
    • 2017-02-27
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多