【问题标题】:How do I import a jQuery plugin via webpack and put it under $/jQuery? (ES6 + TypeScript)如何通过 webpack 导入 jQuery 插件并将其放在 $/jQuery 下? (ES6 + 打字稿)
【发布时间】:2017-01-16 03:51:45
【问题描述】:

我有这几行代码:

import * as $ from "jquery";
import * as jQuery from "jquery";
import "exports?Arrive!arrive";

arrivejs npm 包是一个 jquery 插件。它缺少 module.exports 并且基本上只有“var Arrive”。感谢 WebPack,我设法将它放入我的应用程序中,但现在我想将它的方法放在 jQuery 和 $ 之下。喜欢关注

$.arrive(".coolclass", function() { // do something });
jQuery.arrive(".coolclass", function() { // do something });

我已经为到达js 制作了自己的界面。我最近添加了 JQueryStatic,因为它似乎无法正常工作(我刚开始遵循 ES6 合规性)

interface JQuery {
    arrive(selector: string, options: ArriveOptions, callback: Function): JQuery;
    arrive(selector: string, callback: Function): JQuery;
    unbindArrive(): JQuery;
    unbindArrive(selector: string): JQuery;
    unbindArrive(callback: Function): JQuery;
    unbindArrive(selector: string, callback: Function): JQuery;
    unbindAllArrive(): JQuery;
    leave(selector: string, options: LeaveOptions, callback: Function): JQuery;
    leave(selector: string, callback: Function): JQuery;
    unbindLeave(): JQuery;
    unbindLeave(selector: string): JQuery;
    unbindLeave(callback: Function): JQuery;
    unbindLeave(selector: string, callback: Function): JQuery;
    unbindAllLeave(): JQuery;
}

interface JQueryStatic {
    arrive(selector: string, options: ArriveOptions, callback: Function): JQuery;
    arrive(selector: string, callback: Function): JQuery;
    unbindArrive(): JQuery;
    unbindArrive(selector: string): JQuery;
    unbindArrive(callback: Function): JQuery;
    unbindArrive(selector: string, callback: Function): JQuery;
    unbindAllArrive(): JQuery;
    leave(selector: string, options: LeaveOptions, callback: Function): JQuery;
    leave(selector: string, callback: Function): JQuery;
    unbindLeave(): JQuery;
    unbindLeave(selector: string): JQuery;
    unbindLeave(callback: Function): JQuery;
    unbindLeave(selector: string, callback: Function): JQuery;
    unbindAllLeave(): JQuery;
}

有什么方法可以实现吗?我已经玩了好几个小时了..

更新:我想将到达和其余部分放在 window/jquery 元素下。

目前,这工作正常:

document.arrive("div", function () { console.log("works!");});

但我想把它改成

$(document).arrive("div", function () { console.log("works!");});

【问题讨论】:

  • 图书馆链接不正确。
  • 抱歉,已修复。 :-)

标签: node.js typescript import jquery-plugins ecmascript-6


【解决方案1】:

Arrive.js 将其方法绑定到 jQuery 元素,而不是 jQuery 或 $ 对象本身。试试这个:

$(document).arrive(".coolclass", function() { // do something });

Arrive 对象只公开了两个方法 Arrive.unbindAllArrive() 和 Arrive.unbindAllLeave() 所有其他到达方法都绑定到 javascirpt 和 jQuery 元素。

其次,arrive.js 不依赖于 jQuery。来自文档:

该库不依赖于 jQuery,您可以将下面示例中的 jQuery 元素替换为纯 javascript 元素,它可以正常工作。

【讨论】:

  • 好吧,我不知道。我仍然不确定如何将它放在 jQuery 元素下?如果我尝试做 $(document).arrive,我会收到 Uncaught TypeError: $(...).arrive is not a function
  • 这是一个 chrome 扩展。我使用 npm,但它都是从那里开始的客户端。
  • 经过更多检查后,似乎 $ 在 Arrive 中不可访问。我通过使用import "exports?Arrive!imports?$=jquery!./arrive.js"; 将其强制放入其中,但它似乎仍然无法正常工作。这可能是一个 webpack 问题,但我认为最初的问题可能与 es6 兼容性有关?
  • document.arrive("div", function () { console.log("works!");}); 这是有效的。现在如何将它移动到 JQuery 元素下? :-)
【解决方案2】:

对于任何因我的特殊情况(ES6、Typescript、webpack)而苦苦挣扎的人,我必须将其添加到到达.js 文件的顶部。

window.$ = window.jQuery = require("jquery");

然后当我导入到全局范围时,我必须这样做:

import * as $ from "jquery"; //Present since before, likely relevant
import * as jQuery from "jquery"; //Present since before, likely relevant

import "exports?Arrive!arrive"; // <-

感谢 Uzair 在 Skype 上支持我。他的回答也很有道理,只是与我的问题没有直接关系。

作为奖励,这就是我的 typescript 定义到达的样子。我没有对它进行 PR,因为我没有为它编写测试(需要提交),但有人可以免费为我做,或者直接创建你自己的文件。

// Type definitions for Arrive 2.3.1
// Project: https://github.com/uzairfarooq/arrive
// Definitions by: William Bernting <https://github.com/qvazzler>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped

interface ArriveOptions {
    fireOnAttributesModification?: boolean;
    onceOnly?: boolean;
    existing?: boolean;
}

interface LeaveOptions {
    fireOnAttributesModification?: boolean;
    onceOnly?: boolean;
    existing?: boolean;
}

interface Document {
    arrive(selector: string, options: ArriveOptions, callback: Function): JQuery;
    arrive(selector: string, callback: Function): JQuery;
    unbindArrive(): JQuery;
    unbindArrive(selector: string): JQuery;
    unbindArrive(callback: Function): JQuery;
    unbindArrive(selector: string, callback: Function): JQuery;
    unbindAllArrive(): JQuery;
    leave(selector: string, options: LeaveOptions, callback: Function): JQuery;
    leave(selector: string, callback: Function): JQuery;
    unbindLeave(): JQuery;
    unbindLeave(selector: string): JQuery;
    unbindLeave(callback: Function): JQuery;
    unbindLeave(selector: string, callback: Function): JQuery;
    unbindAllLeave(): JQuery;
}

interface JQuery {
    arrive(selector: string, options: ArriveOptions, callback: Function): JQuery;
    arrive(selector: string, callback: Function): JQuery;
    unbindArrive(): JQuery;
    unbindArrive(selector: string): JQuery;
    unbindArrive(callback: Function): JQuery;
    unbindArrive(selector: string, callback: Function): JQuery;
    unbindAllArrive(): JQuery;
    leave(selector: string, options: LeaveOptions, callback: Function): JQuery;
    leave(selector: string, callback: Function): JQuery;
    unbindLeave(): JQuery;
    unbindLeave(selector: string): JQuery;
    unbindLeave(callback: Function): JQuery;
    unbindLeave(selector: string, callback: Function): JQuery;
    unbindAllLeave(): JQuery;
}

【讨论】:

  • 我在 webpack、TS、es6 和 jquery-textcomplete 方面也有类似的经历。这个答案中对我有帮助的两个键是 1)更改导入 jquery 以包含* as,以及 2)将 jquery-textcomplete 从import textcomplete from 'jquery-textcomplete' 更改为裸import 'jquery-textcomplete'。感谢您提供帮助。
【解决方案3】:

已经发布的解决方案似乎已经过时,因为 import "exports... 不再起作用或缺少某些信息。

无论如何,我的解决方案是首先通过添加类型定义

npm install --save @types/arrive

然后使用ES6 import style 导入相关ts 文件中的类型

import 'arrive';

最后像使用 Arrive.js 一样

document.getElementsByClassName(".my-element")[0].arrive(...)

【讨论】:

  • 接受的答案是 Arrive 2.3.1,但当时,Arrive 被公开为窗口变量。这就是使用导出(webpack 加载器)将其填充到导出中的原因。
猜你喜欢
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 2021-11-11
  • 2020-11-19
  • 1970-01-01
相关资源
最近更新 更多