ES6 + jQuery + Bootstrap - 未捕获的ReferenceError:jQuery没有定义?

时间:2016-10-10 09:01:17

标签: javascript jquery twitter-bootstrap ecmascript-6

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

我尝试过:

/* ========================================================================
 * 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);

但我总是得到这个错误:

  

transition.js:59未捕获的ReferenceError:未定义jQuery

指向此文件:

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']);

有什么想法吗?

修改

我的gulp文件:

{
  "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"
    ]
  }
}

编辑2:

的package.json:

{{1}}

错误:

  

开始'构建' ... events.js:160         扔掉//未处理的错误'事件         ^

     

错误:SyntaxError:位于526的JSON中的意外标记}   解析json文件

5 个答案:

答案 0 :(得分:4)

我已经尝试了这个answer并且有效。



[3]




答案 1 :(得分:2)

一般来说,您在import中进行的解构是不对的,因为$jQuery对象是主要对象:

import $ from 'jquery';

// or
import jQuery from 'jquery'

在您的情况下,您正在处理一个模块(boostrap-transition),它确实需要使用全局范围内的jQuery。 不久前我在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执行此填充程序。

答案 2 :(得分:1)

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

externals: {
  jquery: "jQuery"
}

然后:

import jQuery from 'jQuery';

您也可以尝试:

import * as jQuery from 'jQuery';

答案 3 :(得分:1)

如果您在es6中使用curley括号,则表示您只想要此模块返回的多个段中的该段。 Jquery只暴露了一件事,所以你可以这样做: import $ from 'jquery'; 要么 import jQuery from 'jquery'; 它将始终暴露给一个默认变量

答案 4 :(得分:0)

import jQuery from 'jquery';

import $ from 'jquery';