【问题标题】:'jquery is not defined' when using webpack to load bootstrap'jquery is not defined' 使用 webpack 加载引导程序时
【发布时间】:2016-12-14 00:51:21
【问题描述】:

我刚刚开始学习使用 Webpack(以前我只是使用手动方式分别包含单个脚本)。我使用bootstrap-loader 加载引导程序。这是我的 webpack.config.js

var path = require("path")
var webpack = require('webpack')
var BundleTracker = require('webpack-bundle-tracker')

module.exports = {
    context: __dirname,

    entry: './assets/js/index', // entry point of our app. assets/js/index.js should require other js modules and dependencies it needs

    output: {
        path: path.resolve('./assets/bundles/'),
        filename: "[name]-[hash].js",
    },

    plugins: [
        new BundleTracker({filename: './webpack-stats.json'})
    ],

    module: {
        loaders: [
            { test: /\.jsx?$/, exclude: /node_modules/, loader: 'babel-loader'}, // to transform JSX into JS
            { test: /\.css$/, loader: 'style-loader!css-loader'}, // to transform css
            // images
            { test: /\.png$/, loader: 'url-loader?limit=100000'},
            { test: /\.jpg$/, loader: 'file-loader'},
            // bootstrap image files
            { test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&mimetype=application/font-woff'},
            { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&mimetype=application/octet-stream'},
            { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: 'file'},
            { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&mimetype=image/svg+xml'}
        ],
    },

    resolve: {
        modulesDirectories: ['node_modules', 'bower_components'],
        extensions: ['', '.js', '.jsx'],
        jquery: './vendor/jquery/jquery.js',
    },
}

这是我的 entry.js

global.jQuery = global.$ = require('jquery');
require('bootstrap-loader');

这似乎有效。但是,我以前用过这个,它不起作用:

window.jQuery = window.$ = require('jquery');

我发现上面有很多人建议的行。但我只是在加载页面时遇到错误。只是一些例子:some SO questionwebpack issueanother SO question

后来我找到了this questionthis question。因此,该页面实际上也适用于 bootstrap js 功能。

如果相关,我也会添加我的 package.json:

{
  "author": "franklingu",
  "dependencies": {
    "babel": "^6.5.2",
    "babel-core": "^6.13.2",
    "babel-loader": "^6.2.4",
    "bootstrap-loader": "^1.2.0-beta.1",
    "bootstrap-sass": "^3.3.7",
    "extract-text-webpack-plugin": "^1.0.1",
    "jquery": "^3.1.0",
    "node-sass": "^3.8.0",
    "resolve-url-loader": "^1.6.0",
    "sass-loader": "^4.0.0",
    "webpack": "^1.13.1",
    "webpack-bundle-tracker": "0.0.93"
  },
  "devDependencies": {
    "babel-core": "^6.13.2",
    "babel-loader": "^6.2.4",
    "css-loader": "^0.23.1",
    "file-loader": "^0.9.0",
    "node-sass": "^3.8.0",
    "resolve-url-loader": "^1.6.0",
    "sass-loader": "^4.0.0",
    "style-loader": "^0.13.1",
    "url-loader": "^0.5.7",
    "webpack": "^1.13.1"
  }
}

我是 webpack 的新手,但我对 JS 并不陌生。我想知道为什么 window.$ 不起作用。

我想知道,对于 webpack,为什么有些人在插件中建议这样做:

        new webpack.ProvidePlugin({
            'window.jQuery': 'jquery',
            'window.$': 'jquery',
        })

有些人建议这样做(对我也不起作用):

 resolve: {
    alias: {
        jquery: "jquery/src/jquery"
    }
}

当时我玩过 node 一段时间,我记得 node 使用 request js 进行加载(虽然我不太清楚 common 与 require 与 amd 之间的区别)。但是为什么有人会提到常见的js呢?

我开发后端有一段时间了,刚开始做前端——很多问题都冒出来了。如果您向我提供一些阅读指南的链接就足够了,这可以消除我的疑虑/建立我对这些的基本理解。

【问题讨论】:

    标签: javascript jquery node.js twitter-bootstrap webpack


    【解决方案1】:

    我想将我的发现分享给任何可能有与我相同用例的未来开发人员。

    我只需要使用 Webpack 4 (4.16.4) 为 AngularJS (1.7.2) 应用创建供应商捆绑包而不是应用捆绑包.我认为因为我只是创建了一个供应商捆绑包,所以其他解决方案都不起作用。只有expose-loader 为我工作,就像这样:

        // webpack.config.js
        module: {
            rules: [
                {
                    test: require.resolve('jquery'),
                    use: [{
                            loader: 'expose-loader',
                            options: 'jQuery'
                        },
                        {
                            loader: 'expose-loader',
                            options: '$'
                        }
                    ]
                }
            ]
        }
    

    欲了解更多信息:https://github.com/webpack-contrib/expose-loader

    【讨论】:

    • 只需添加将“expose-loader”依赖项添加到项目所需的内容
    • 另外注意,你需要安装expose-loader: ^1.0.0,否则你会得到:TypeError: this.getOptions is not a function,因为expose-loader ^2.0.0需要webpack 5
    【解决方案2】:

    我知道这有点老了,但我设法做到了:

    global.jQuery = require('jquery'); 要求('引导');

    【讨论】:

      【解决方案3】:

      不需要插件。只需使用以下作为条目:

      entry: [
          'jquery', //will load jquery from node_modules
          './assets/js/index',
      ]
      

      然后在 ES6+ 文件中使用:

      import $ from "jquery";
      

      【讨论】:

      • 这在 Webpack 2 中有效吗?这是否确保indexjquery 被执行之前不会被执行?
      • @Flimm Webpack 2 在“入口”部分没有变化,所以也应该在那里工作。
      • @Flimm 好,把'jquery'作为第一条记录:)。我更新了我的答案。
      • 当使用带有 jQ​​uery 导入的单条目文件时,我得到 jQuery 没有在 chrome 开发工具中为此文件定义(在 jquery 之后导入):css-tricks.com/examples/Loadingdotdotdot/js/…
      • @user1063287 导入是本地范围。当 import 语句不在您提到的文件中时,它将不可用。 Hack 可能是在入口文件中导入并设置全局:window.jQuery = $.我没有足够的背景信息来提供更好的建议。
      【解决方案4】:

      将此添加为插件

        new webpack.ProvidePlugin({
         $: "jquery",
         jQuery: "jquery"
        })
      

      并且您应该能够在整个项目中使用 jquery。

      如果添加插件后问题仍然存在,请尝试重新启动您的 nodejs 服务器。记得使用npm install --save jquery 安装jquery

      【讨论】:

      • 我确实在我的问题中提出了这个问题。也许你可以再读一遍。这个解决方案对我不起作用
      • 如果你使用这个插件它应该可以工作并且你不需要设置别名..check this seed
      • 注意:一旦你用 webpack 插件插入了 jquery,你就不需要用 require 导入它,你可以去开发工具并输入 $ 来查看 jquery 已经加载。我在您的代码中没有看到任何其他奇怪的东西,它应该可以正常工作:-)
      • 这不适用于 Webpack 4.8.3。流程最近是否发生了变化?我已经设置了插件。我还通过 npm 安装了 jquery 3.3.1。我可以运行 npm start,但是浏览器没有加载 jquery。
      • 除了使用上面的代码和npm install jquery之外还需要其他步骤吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 2022-10-24
      • 2020-05-10
      • 1970-01-01
      相关资源
      最近更新 更多