如何使用ES6语法导入jquery?

Édo*_*pez 110 import jquery browserify ecmascript-6 semantic-ui

我正在使用(JavaScript)ES6语法通过babel转换器和preset-es2015插件以及semantic-ui样式编写一个新的应用程序.

index.js

import * as stylesheet from '../assets/styles/app.scss';
import * as jquery2 from '../dist/scripts/jquery.min';
import * as jquery3 from '../node_modules/jquery/dist/jquery.min';

console.log($('my-app'));
Run Code Online (Sandbox Code Playgroud)

的index.html

<!DOCTYPE html>
<html lang="fr">
<head>
<body>
<script src="dist/app.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

项目结构

.
??? app/
?   ??? index.js
??? assets/
??? dist/
?   ??? scripts/
?   ?   ??? jquery.min.js
??? index.html
??? node_modules/
?   ??? jquery/
?   ?   ??? dist/
?   ?   ?   ??? jquery.min.js
??? package.json
??? tests/
Run Code Online (Sandbox Code Playgroud)

的package.json

  …
  "scripts": {
    "build:app": "browserify -e ./app/index.js -o ./dist/app.js",
    "copy:jquery": "cpy 'node_modules/jquery/dist/jquery.min.js' ./dist/scripts/",
    …
  },
  "devDependencies": {
    "babel-core": "6.3.x",
    "babel-preset-es2015": "6.3.x",
    "babelify": "7.2.x",
    "cpy": "3.4.x",
    "npm-run-all": "1.4.x",
    "sassify": "0.9.x",
    "semantic-ui": "2.1.x",
    …
  },
  "browserify": {
    "transform": [
      [ "babelify", { "presets": [ "es2015"]}],
      [ "sassify", { "auto-inject": true}]
    ]
  }
Run Code Online (Sandbox Code Playgroud)

使用经典<script>标签导入jquery工作正常,但我正在尝试使用ES6语法.

  • 如何导入jquery以满足semantic-ui使用ES6导入语法?
  • 我应该从node_modules/目录或我的dist/(我复制所有内容)导入?

Édo*_*pez 119

index.js

import {$,jQuery} from 'jquery';
// export for others scripts to use
window.$ = $;
window.jQuery = jQuery;
Run Code Online (Sandbox Code Playgroud)

首先,正如@nem在评论中建议的那样,导入应该来自node_modules/:

好吧,导入从dist/没有意义,因为这是您的生产就绪应用程序的分发文件夹.构建你的应用程序应该采取内部的东西node_modules/,并将其添加到dist/文件夹,包括jQuery.

接下来,glob - * as- 是错误的,因为我知道我正在导入什么对象(例如 jQuery$),因此一个简单的import语句将起作用.

最后你需要使用它将它暴露给其他脚本window.$ = $.

然后,我作为两者导入$jQuery覆盖所有用法,browserify删除导入复制,所以这里没有开销!^ O ^ÿ

  • 为什么不从'jquery'中导入`import {$,jQuery};`?为什么这么多进口? (13认同)
  • 我得到```Module'"jquery"'没有导出成员'jQuery'```或```Module'"jquery"'没有默认导出```我想丢失什么? (12认同)
  • 不知道你们是否还在,但是你能解释一下`window.$ = $`的必要性.我不明白为什么需要这样做.当browserify发挥作用时,其他脚本是否会自动捆绑到单个`js`脚本中? (4认同)
  • 你如何找到名称确切的类名,即`jQuery`? (4认同)
  • @qarthandso `window` 是一个全局对象,因此将 `jquery` 或 `$` 附加到它可以使其在任何地方都可用(请参阅http://stackoverflow.com/a/9895261/802365) (2认同)
  • 较旧版本的jQuery不使用命名导出.较新的版本.导入方法取决于您使用的jQuery版本. (2认同)

ha7*_*ilm 47

基于ÉdouardLopez的解决方案,但有两行:

import jQuery from "jquery";
window.$ = window.jQuery = jQuery;
Run Code Online (Sandbox Code Playgroud)

  • @NabilBaadillah `require`(CommonJS)不是 `import`(ES 模块),并且单行似乎不可能使用 `import`。(有人关心?) (5认同)
  • 这对我有用,而接受的答案方法没有......我使用了大致相同的: import $ from 'jquery'; window.jQuery = $;window.$ = $; (4认同)
  • 一行:`window.$ = window.jQuery = require('jquery');` (2认同)

小智 11

在Global范围中导入整个JQuery的内容。这会将$插入到当前范围中,其中包含从JQuery导出的所有绑定。

import * as $ from 'jquery';
Run Code Online (Sandbox Code Playgroud)

现在,$属于window对象。

  • 这对我有用。顶部“从'jquery'导入{jQuery as $};” 给出错误,指出“jQuery”未找到。 (2认同)

Muh*_*eda 8

webpack 用户,将以下内容添加到您的plugins数组中。

let plugins = [
  // expose $ and jQuery to global scope.
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery'
  })
];
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的优点是什么?因为您在这里将自己绑定到您的构建工具。 (4认同)
  • 这是 webpack 用户的最佳解决方案,因为 jQuery 应该在所有文件中全局可用,没有多余的 import 语句。 (2认同)

Rit*_*tin 7

接受的答案对我来说不起作用
注意:使用汇总js不知道这个答案是否属于这里 npm
之后
i -
在custom.js中保存jquery

import {$, jQuery} from 'jquery';
Run Code Online (Sandbox Code Playgroud)

要么

import {jQuery as $} from 'jquery';
Run Code Online (Sandbox Code Playgroud)

我收到错误:模块... node_modules/jquery/dist/jquery.js不导出jQuery

模块... node_modules/jquery/dist/jquery.js不导出$
rollup.config.js

export default {
    entry: 'source/custom',
    dest: 'dist/custom.min.js',
    plugins: [
        inject({
            include: '**/*.js',
            exclude: 'node_modules/**',
            jQuery: 'jquery',
            // $: 'jquery'
        }),
        nodeResolve({
            jsnext: true,
        }),
        babel(),
        // uglify({}, minify),
    ],
    external: [],
    format: 'iife', //'cjs'
    moduleName: 'mycustom',
};
Run Code Online (Sandbox Code Playgroud)

尝试而不是汇总注入

commonjs({
   namedExports: {
     // left-hand side can be an absolute path, a path
     // relative to the current directory, or the name
     // of a module in node_modules
     // 'node_modules/jquery/dist/jquery.js': [ '$' ]
     // 'node_modules/jquery/dist/jquery.js': [ 'jQuery' ]
        'jQuery': [ '$' ]
},
format: 'cjs' //'iife'
};
Run Code Online (Sandbox Code Playgroud)

的package.json

  "devDependencies": {
    "babel-cli": "^6.10.1",
    "babel-core": "^6.10.4",
    "babel-eslint": "6.1.0",
    "babel-loader": "^6.2.4",
    "babel-plugin-external-helpers": "6.18.0",
    "babel-preset-es2015": "^6.9.0",
    "babel-register": "6.9.0",
    "eslint": "2.12.0",
    "eslint-config-airbnb-base": "3.0.1",
    "eslint-plugin-import": "1.8.1",
    "rollup": "0.33.0",
    "rollup-plugin-babel": "2.6.1",
    "rollup-plugin-commonjs": "3.1.0",
    "rollup-plugin-inject": "^2.0.0",
    "rollup-plugin-node-resolve": "2.0.0",
    "rollup-plugin-uglify": "1.0.1",
    "uglify-js": "2.7.0"
  },
  "scripts": {
    "build": "rollup -c",
  },
Run Code Online (Sandbox Code Playgroud)

这工作:
删除了汇总注入和commonjs插件

import * as jQuery from 'jquery';
Run Code Online (Sandbox Code Playgroud)

然后在custom.js

$(function () {
        console.log('Hello jQuery');
});
Run Code Online (Sandbox Code Playgroud)


Yuk*_*élé 6

您可以创建模块转换器:

// jquery.module.js
import 'https://code.jquery.com/jquery-3.3.1.min.js'
export default window.jQuery.noConflict(true)
Run Code Online (Sandbox Code Playgroud)

这将删除jQuery引入的全局变量,并将jQuery对象导出为默认值.

然后在你的脚本中使用它:

// script.js
import $ from "./jquery.module.js";

$(function(){
  $('body').text('youpi!');
});
Run Code Online (Sandbox Code Playgroud)

不要忘记将其作为模块加载到文档中

<script type='module' src='./script.js'></script>
Run Code Online (Sandbox Code Playgroud)

http://plnkr.co/edit/a59ETj3Yo2PJ0Aqkxbeu?p=preview

  • 这个有帮助!我通常喜欢在使用任何 IDE/DevEnv 之前尝试基础知识。在不使用 Node/NPM/Babble 的情况下,我想了解 ES6 导入和导出。我已经成功地完成了基本的导入和导出工作,但在 jquery 包含方面遇到了困难。我将自定义代码编写为模块,但仍然使用 html 中的 script 标记以其传统方式引用 jquery。所以我最终有 2 个脚本标签,一个包含 jquery,另一个包含 app.js。根据您的回答,我可以摆脱我的第一个 jquery 脚本标签并按照您的建议使用中间 jquery.module.js 。 (2认同)

Ste*_*ank 6

我还没有看到这个确切的语法发布,它在 ES6/Webpack 环境中对我有用:

import $ from "jquery";
Run Code Online (Sandbox Code Playgroud)

直接取自jQuery 的 NPM 页面。希望这可以帮助某人。


cra*_*tin 5

如果可以帮助任何人,则将挂起javascript import语句。因此,如果库在全局名称空间(窗口)中对jquery具有依赖项(例如,引导程序),则将无法使用:

import {$,jQuery} from 'jquery';
window.$ = $;
window.jQuery = jQuery;
import 'bootstrap/dist/js/bootstrap.min';
Run Code Online (Sandbox Code Playgroud)

这是因为在将jQuery附加到窗口之前,已启动并评估了引导程序的导入。

解决此问题的一种方法是不直接导入jQuery,而是导入一个模块,该模块本身会导入jQuery并将其附加到窗口。

import jQuery from './util/leaked-jquery';
import 'bootstrap/dist/js/bootstrap.min';
Run Code Online (Sandbox Code Playgroud)

这里leaked-jquery看起来像

import {$,jQuery} from 'jquery';
window.$ = $;
window.jQuery = jQuery;
export default $;
export jQuery;
Run Code Online (Sandbox Code Playgroud)

EG,https://github.com/craigmichaelmartin/weather-app--birch/blob/4d9f3b03719e0a2ea3fb5ddbbfc453a10e9843c6/javascript/util/leak_jquery.js