javascript - ES6 代码不适用于 jQuery

标签 javascript jquery typescript ecmascript-6 webpack

我有一个用作库的 es6 js 文件。如您所见,js 文件依赖于 jquery。我正在使用 Webpack。

在 JS 文件中,我在下面的行中生成了我在下面复制的最终 es5 代码中的 _interopRequireWildcard。由于 jquery 不是 esModule,在评估条件 obj && obj.__esModule 之后,jQuery 函数被复制到一个对象。我也将此代码与 typescript 一起使用。它适用于 Typescript,但在 es6 上失败。

ES6 代码片段

import * as $ from 'jquery';

let setupObject = function setupObject(element) {
 let aButton = $(dropdownButtonSelector); //Fail's here with error
                  //Uncaught TypeError: $ is not a function
}
exports default setupObject;

转译的 ES5 代码

Object.defineProperty(exports, "__esModule", {
 value: true
});

var _jquery = __webpack_require__(1);

var $ = _interopRequireWildcard(_jquery);

function _interopRequireWildcard(obj) {
  if (obj && obj.__esModule) { //obj.__esModule = undefined for jquery
    return obj;
} else {
    var newObj = {};
    if (obj != null ) {
        for (var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key))
                newObj[key] = obj[key];
        }
    }
    newObj.default = obj;
    return newObj;
  }
}

var setupObject = function setupObject(element) {
 var aButton = $(dropdownButtonSelector); //Fail's here with error
                  //Uncaught TypeError: $ is not a function
}
exports.default = setupObject;

最佳答案

您的导入获取所有可用的导入并将它们包装在一个对象中:

import * as $ from 'jquery';

所以 $ 可能看起来像这样:

{Animation: function Animation(...),Callback: function (...), Deferred: function(...), default: function(selector, context){}, fn: Object[0], .... }

因此你的TypeError:

Uncaught TypeError: $ is not a function

(参见:http://www.2ality.com/2014/09/es6-modules-final.html#more_on_importing_and_exporting)

尝试使用以下语句,它只会导入default 导出:

import $ from 'jquery';

由于您的 jQuery 可能仍然具有 CommonJS 导出(module.exports),它的导出将自​​动映射到 babel 的 export default

关于javascript - ES6 代码不适用于 jQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37213647/

相关文章:

Angular 错误 TS2554 :Expected 0 arguments, 但在管道运算符上得到 x

javascript - 切换主题后 jquery 选项卡不工作

javascript - 防止点击事件传播/冒泡到 Google map 上

javascript - 使用 moment.js,如何为用户显示当前日期格式?

javascript - 带有 promise 的服务中的 Angular "this"符号和数据

javascript - 在 HTML 解析器中保留 htl 和 body 标签

jquery - 限制容器内的可拖动元素

node.js - 在 node.js(和 Angular 2)上使用 systemjs

javascript - 如何正确使用moment.js?

javascript - 如何保护全局变量(窗口)不被覆盖