【问题标题】:ES6 + jQuery + Bootstrap - Uncaught ReferenceError: jQuery is not defined?ES6 + jQuery + Bootstrap - Uncaught ReferenceError: jQuery is not defined?
【发布时间】:2017-02-18 15:58:00
【问题描述】:

如何在 ES6 中导入 jQuery 作为 bootstrap 的依赖项?

我试过了:

import {$,jQuery}  from 'jquery';
import bootstrap from 'bootstrap';

但我总是得到这个错误:

transition.js:59 Uncaught ReferenceError: jQuery is not defined

哪个指向这个文件:

/* ========================================================================
 * Bootstrap: transition.js v3.3.7
 * http://getbootstrap.com/javascript/#transitions
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================

  function transitionEnd() {
    var el = document.createElement('bootstrap')

    var transEndEventNames = {
      WebkitTransition : 'webkitTransitionEnd',
      MozTransition    : 'transitionend',
      OTransition      : 'oTransitionEnd otransitionend',
      transition       : 'transitionend'
    }

    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
      }
    }

    return false // explicit for ie8 (  ._.)
  }

  // http://blog.alexmaccaw.com/css-transitions
  $.fn.emulateTransitionEnd = function (duration) {
    var called = false
    var $el = this
    $(this).one('bsTransitionEnd', function () { called = true })
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
    setTimeout(callback, duration)
    return this
  }

  $(function () {
    $.support.transition = transitionEnd()

    if (!$.support.transition) return

    $.event.special.bsTransitionEnd = {
      bindType: $.support.transition.end,
      delegateType: $.support.transition.end,
      handle: function (e) {
        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
      }
    }
  })

}(jQuery);

有什么想法吗?

编辑:

我的 gulp 文件:

var gulp = require('gulp');
var browserify = require('browserify');
var babelify = require('babelify');
var source = require('vinyl-source-stream');
var gutil = require('gulp-util');

gulp.task('es6', function() {
    browserify({
        entries: 'js/app.js',
        debug: true
    })
    .transform(babelify, { presets: ['es2015'] })
    .on('error',gutil.log)
    .bundle()
    .on('error',gutil.log)
    .pipe(source('compile.js'))
    .pipe(gulp.dest('js'));
});

gulp.task('default', ['es6']);

编辑 2:

package.json:

{
  "name": "es6",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-preset-es2015": "^6.16.0",
    "babelify": "^7.3.0",
    "browserify": "^13.1.0",
    "gulp": "^3.9.1",
    "gulp-uglify": "^2.0.0",
    "gulp-util": "^3.0.7",
    "pump": "^1.0.1",
    "vinyl-source-stream": "^1.1.0"
  },
  "browser": {
    "jquery": "./node_modules/jquery/dist/jquery.js",
  },
  "browserify-shim": {
    "jquery": "$", // or change it to jQuery
  },
  "browserify": {
    "transform": [
      "browserify-shim"
    ]
  }
}

错误:

开始“构建”... events.js:160 投掷者; // 未处理的“错误”事件 ^

错误:SyntaxError: Unexpected token } in JSON at position 526 while 解析json文件

【问题讨论】:

  • 您在import 中使用的是一个名为“解构”的 ES6 功能:它会在您正在导入的对象内部查找名为 $ 和 jQuery 的两个属性。您遇到的问题是导入的实际对象是$ 之一。试试这个:import $ from "jquery"; window.jQuery = $;
  • 谢谢。我已经尝试过了,但仍然是同样的错误。
  • 那么你可能不得不告诉webpack 以使jQuery 变量可用于全局命名空间中的其他模块,如@galkowskit 的答案所示

标签: javascript jquery twitter-bootstrap ecmascript-6


【解决方案1】:

我已经试过这个answer 并且成功了。

// webpack.config.js
module.exports = {
    ...
    plugins: [
        new webpack.ProvidePlugin({
           $: "jquery",
           jQuery: "jquery"
       })
    ]
};

【讨论】:

【解决方案2】:

一般而言,您在 import 中所做的解构是不对的,因为 $ 或 jQuery 对象是主要对象:

import $ from 'jquery';

// or
import jQuery from 'jquery'

在您的情况下,您正在处理一个确实希望在全局范围内使用 jQuery 的模块 (boostrap-transition)。 前段时间我在这件事上也遇到过类似的问题,materialize 模块。

如果您使用的是webpack,您可以按照@galkowskit 回答步骤进行操作。
如果您改用browserify,您需要的是browserify transform,如下所示:

"browser": {
  "jquery": "./node_modules/jquery/dist/jquery.js",
},
"browserify-shim": {
  "jquery": "$", // or change it to jQuery
},
"browserify": {
  "transform": [
    "browserify-shim"
  ]
}

你可以把它放在你的 package.json 文件中:当 Gulp 将调用 browserify 时,它会读取你的 package.json 以获取配置提示并为 jQuery 执行这个 shim。

【讨论】:

  • 谢谢,但我遇到了错误。我说对了吗?请查看我的编辑 2。谢谢。
  • 删除评论// or change it to jQuery。我把它留在那里作为建议,但 JSON 解析器不喜欢它。
【解决方案3】:
import jQuery from 'jquery';

或

import $ from 'jquery';

【讨论】:

    【解决方案4】:

    如果你在 es6 中使用 curley 括号,你是说你只想要这个模块返回的几个段中的那个段。 Jquery 只公开一件事,所以你可以这样做: import $ from 'jquery'; 要么 import jQuery from 'jquery'; 它总是暴露给一个默认变量

    【讨论】:

      【解决方案5】:

      在 Webpack 中我通常使用 (webpack.config.js):

      externals: {
        jquery: "jQuery"
      }
      

      然后:

      import jQuery from 'jQuery';
      

      你也可以试试:

      import * as jQuery from 'jQuery';
      

      【讨论】:

      • 我不使用 webpack。我使用 gulp 压缩文件。
      • 您使用什么作为模块捆绑器?我认为除了使用 gulp 进行缩小之外,您还需要一些可以利用 ES6 的导入/导出语法的东西。 Webpack、Browserify 或 System.js 等。我认为浏览器还不支持 ES6 模块。
      • 我使用 Browserify,一饮而尽
      • import * as jQuery from 'jQuery'; 仍然给我同样的错误。
      • 我在 Angular 4 项目中使用 Webpack,尝试了这个解决方案,但没有成功。
      猜你喜欢
      • 2020-05-24
      • 1970-01-01
      • 2017-04-30
      • 2021-12-10
      • 2018-08-27
      • 2018-08-03
      • 2019-07-24
      • 2019-01-04
      • 1970-01-01
      相关资源
      最近更新 更多