如何在Vue.js的Webpack CLI项目中引入jQuery?

4

你好,我曾使用vuejs cli来生成项目(https://github.com/vuejs/vue-cli)。该cli使用webpack,我在vue文件中使用jquery时遇到了问题。我一直得到一个。

http://eslint.org/docs/rules/no-undef  '$' is not defined

我尝试编辑webpack.dev.config文件并添加provide插件块,如下所示:

var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')

// add hot-reload related code to entry chunks
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
  baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})

module.exports = merge(baseWebpackConfig, {
  module: {
    rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
  },
  // cheap-module-eval-source-map is faster for development
  devtool: '#cheap-module-eval-source-map',
  plugins: [
    new webpack.DefinePlugin({
      'process.env': config.dev.env
    }),
    // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoEmitOnErrorsPlugin(),
    // https://github.com/ampedandwired/html-webpack-plugin
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: 'index.html',
      inject: true
    }),
    new FriendlyErrorsPlugin(),
    new webpack.ProvidePlugin({
      $ : "jquery",
      jQuery : "jquery"
    })
  ]
})

然而,在尝试使用jquery时,我一次又一次地遇到相同的问题。我并不反对为此使用cdn,但无论我尝试什么,都无法包含jquery。

如果vue文件有帮助,那么我会像这样在脚本块内尝试console.log $。

<script>
export default {
  name: 'how_can_we_help_you',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  }
}
console.log($)
</script>

请帮我,我很困扰,一直在尝试解决这个问题,但一直没成功。谢谢!


为什么在Vue中需要使用jQuery?在vue或angular项目中,同时使用jquery和vue/angular被认为是一个非常不好的做法。无论你在jquery中能够实现什么,都应该在vue中写出同样的代码。 - Plankton
@Plankton 不是真的。有些操作使用jQuery更容易。 - John
你可能会觉得这个链接很有趣:http://vuetips.com/bootstrap - Arj
@john 通常不会。jQuery 只是更为熟悉而已。使用 jQuery 的真正问题在于它通常用于 DOM 操作,而这也被 Vue 处理,所以如果你不小心就会陷入混乱,这就是为什么它被认为是不良实践的原因。如果你小心谨慎,那就没问题了。 - craig_h
@craig_h 我知道这一点。但有些部分,jQuery 处理得比 Vue 更好、更容易。我的意思是,你可以用一行 jQuery 代码来代替通过组件分发事件和编写方法的复杂操作 --- 当然,前提是不干扰 Vue 渲染的数据。希望你能明白我这里的表述。 - John
@john,实际上并不是这样。仅仅因为某个东西更简单(而且你已经知道它)并不意味着将一个库添加到生产环境中。这只会使打包和加载过程变得更加繁琐。作为一个好奇的开发者,可以在这些方面犹豫不决,但除非真的避免不了,否则应该尽量避免。 - Plankton
4个回答

8

搜索了两天后,找到了eslintrc.js文件。

将以下内容添加到文件中即可修复provide插件问题。

env: {
  browser: true,
  jquery: true
},

7

进入main.js并执行以下操作

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

或者
Vue.use({
    install: function(Vue, options){
        Vue.prototype.$jQuery = require('jquery'); // you'll have this.$jQuery anywhere in your vue project
    }
})

在网上看了很多复杂的答案后,结果发现最简单的一行代码就能让它正常工作。非常好。 - brainbag

2

对于那些没有使用webpack的人来说,另一种方法是使用expose-loader:

yarn add expose-loader

并且在你的 main.js 文件中

import "expose-loader?$!jquery";

0

我找到了解决方案。我将我的更改放入 webpack.dev.conf.js 而非 webpack.dev.config,以及 eslintrc.json 而非 eslintrc.js。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接