jquery-ui und webpack, wie man es in modul verwaltet?

72

Irgendeine Idee, wie man damit umgeht? Ich meine, jquery-ui scheint nicht amd zu sein und ich weiß nicht, wie ich damit umgehen soll, irgendeine Idee?

François Richard
quelle

Antworten:

45

Du hast Glück, dass ich das gestern gemacht habe, es ist ziemlich einfach.

npm install --save jquery jquery-ui

Stellen Sie sicher, dass Sie einen Alias-Jias haben, der mit dem Plugin in der Datei webpack.config.js aufgelöst werden soll

...
plugins: [
    new webpack.ProvidePlugin({
      "$":"jquery",
      "jQuery":"jquery",
      "window.jQuery":"jquery"
    }),
...

Fügen Sie dann zwei Aliase in die Datei webpack.config.js ein

  1. Der Ordner node_modules
  2. Der Ordner jquery-ui

`` `` ``

resolve : {
    alias: {
      // bind version of jquery-ui
      "jquery-ui": "jquery-ui/jquery-ui.js",      
      // bind to modules;
      modules: path.join(__dirname, "node_modules"),

Stellen Sie sicher, dass jquery zuerst in Ihre App-Startdatei geladen wird.

var $ = require("jquery"),
        require("jquery-ui");

Wenn Sie ein Thema verwenden müssen, konfigurieren Sie den CSS-Loader und den File-Loader. Vergessen Sie nicht, diese Lader zu installieren.

module: {
    loaders: [
      { test: /\.css$/, loader: "style!css" },
      { test: /\.(jpe?g|png|gif)$/i, loader:"file" },

Und in Ihrer App-Startdatei verwenden.

require("modules/jquery-ui/themes/black-tie/jquery-ui.css");
require("modules/jquery-ui/themes/black-tie/jquery-ui.theme.css");
wendellmva
quelle
Was ist die App-Startdatei? Wenn Sie $ dort initialisieren, wie können Sie es für alle Ihre Dateien global machen?
e18r
10
Verwenden Sie npm? jquery-ui.js kommt nicht mit
e18r
1
Die Startdatei ist die Datei, wenn Sie den Knoten app.js ausführen, die Eingabedatei Ihrer App. Wenn Sie das Bereitstellungs-Plugin verwenden, machen Sie es auf diese Weise global für jede Datei, die von Webpack verarbeitet wird. Für alle anderen Dateien benötigen Sie es nur. Ja, ich verwende npm. Sie müssen jquery und jquery-ui und alle anderen wie Webpack und die von Ihnen verwendeten Loader benötigen, bevor diese Lösung funktioniert.
Wendellmva
Die folgende Antwort gilt nur für die Verwendung des Bundles und ist nicht geeignet, wenn Sie nQ jQuery installieren, da Sie auf diese Weise nicht das Bundle, sondern das Paket erhalten!
Wendellmva
@WendellMuntslag Ich musste meinem webpack.config.js nur ein neues webpack.ProvidePlugin ({"$": "jquery", "jQuery": "jquery", "window.jQuery": "jquery"}) hinzufügen. Benötigte den Alias. Es funktionierte. Vielen Dank.
Will
82

Aus irgendeinem Grund jquery-uispielte nicht gut mit Webpack. Ich musste jquery-ui-bundlestattdessen verlangen .

npm i -S jquery-ui-bundle

und dann benötigen Sie es nach jquery zB

require('jquery');
require('jquery-ui-bundle');
KhaledMohamedP
quelle
11
Vielen Dank. Hat mir so viel Kopfschmerzen erspart. Scheint, dass das jquery-ui-Paket keine fertig gebaute jquery-ui.js-Datei enthält: /
Sammi
Dies funktionierte auch für die Bereitstellung meiner Elektronen-App. Vielen Dank!
UltrasoundJelly
2
Können Sie bitte Ihre Antwort mit einem Arbeitsbeispiel von webpack.config.jsmit jquery und erweitern jquery-ui?
Thomas Szteliga
jquery-uifunktioniert jetzt gut mit webpack. Siehe meine Antwort.
Aruna Herath
Ich habe stundenlang versucht herauszufinden, warum jquery-ui während der Migration von vanilla js zur Create React App Fehler auslöst ... Diese Antwort hat meinen Tag gemacht !!
Marius B
80

jquery-ui-distund jquery-ui-bundlescheinen nicht vom jquery-ui-Team gepflegt zu werden. Nach jquery-ui v1.12 Es ist möglich, das offizielle jquery-uiPaket von npm mit Webpack zu verwenden.

Aktualisieren Sie jquery-ui auf 1.12, indem Sie package.jsonund aktualisieren npm install.

Dann können Sie requirejedes Widget so.

require("jquery-ui/ui/widgets/autocomplete");
require("jquery-ui/ui/widgets/draggable");

Wenn Sie zuvor verwendet require("jquery-ui")haben, müssen Sie es für jedes Widget durch separate Importe ersetzen. Ich denke, der neue Weg ist besser, weil er nur den Code für das Widget bündelt, das wir verwenden müssen.

Siehe Dokumentation zur Verwendung des offiziellen npm-Pakets 1.12.

Aruna Herath
quelle
1
Diese Antwort hat mir am meisten geholfen, aber meine hat immer noch nicht funktioniert, bis ich sie dynamisch geladen hatte. Es konnte während der Kompilierungszeit nicht benötigt werden, da das ziehbare Widget ständig nach einem jQuery-Objekt suchte. (nicht global.jQuery oder window.jQuery). Also hatte ich es nach dem Laden der Seite erforderlich
Löwin
@NnennaUde fügt require('jquery');vor der require("jquery-ui/ui/widgets/draggable");Arbeit hinzu?
Aruna Herath
2
Nein, das war nicht das Problem. Jedenfalls konnte ich es seitdem zum Laufen bringen. Es ist immer noch ein Rätsel, was das Problem eigentlich war. Ich hatte jedoch Probleme, es in einer jsdom-Testumgebung zum Laufen zu bringen. Der gleiche Fehler tauchte erneut auf. $.widget( "ui.draggable", $.ui.mouse, { TypeError: Cannot read property 'mouse' of undefined Ich konnte es jedoch beheben, indem ich alle Abhängigkeiten wie folgt verlangte : require('jquery-ui/ui/version'); require('jquery-ui/ui/plugin'); require('jquery-ui/ui/widget'); require('jquery-ui/ui/widgets/mouse');
Löwin
1
So bitter darüber, wie schwierig es ist, Dokumentation für NPM-Installationsanweisungen auf JQuery-UI zu finden. Ich kann es kaum erwarten, bis ich diese Bibliothek aus meinem aktuellen Projekt ermorden kann!
Ecbrodie
Wie kann man CSS-Dateien von Autocomplete einschließen?
Vijay Meena
18

webpack-jquery-ui

webpack-jquery-ui - Verwenden Sie dieses Plugin, z. B. wenn Sie Rails 5 verwenden, führen Sie es aus

 yarn add webpack-jquery-ui

Wenn das jQuery UI-Plugin gestartet wird, wird überprüft, ob jquery bereitgestellt wurde

Fügen Sie diesen Code Ihrer Webpacker-Konfigurationsdatei hinzu (shared.js - wenn Sie ihn mit Rails 5 verwenden).

plugins: [
  new webpack.ProvidePlugin({
      $: "jquery",
      jQuery: "jquery",
      "window.jQuery": "jquery'",
      "window.$": "jquery"
  })
]

Fügen Sie diese Zeilen in Ihren App-Code ein.

require('webpack-jquery-ui');
require('webpack-jquery-ui/css');

zu beheben ActionController::InvalidAuthenticityTokeninjquery.ajax

Sie haben eine übergeben authenticity_tokenParameter mit allen PUT, POSTundDELETE Anfragen.

Dazu können Sie es normalerweise mit aus dem Header abrufen $('[name="csrf-token"]')[0].content

Ihre Anfrage würde also ungefähr so ​​aussehen:

var that = this;
$.ajax({
  url: navigator_item.url,
  data: { authenticity_token: $('[name="csrf-token"]')[0].content},
  method: 'DELETE',
  success: function(res) {
   ...
  }
});

Ich füge jQuery auf andere Weise in meine Anwendung ein

Anstatt zu verwenden:

plugins: [
new webpack.ProvidePlugin({...

Sie sollten 'jquery': 'jquery / src / jquery' zu Aliasen in der Webpack-Konfigurationsdatei hinzufügen:

module.exports = {
  resolve: {
    alias: {
        'jquery': 'jquery/src/jquery'
    }
  }

Es wird den Modulnamen 'jquery' bereitstellen. Die jQuery-Benutzeroberfläche überprüft diesen Namen bei init.

Dann schreiben Sie in Ihre app.js-Datei:

import $ from 'jquery'

import 'webpack-jquery-ui/css'
import 'webpack-jquery-ui/sortable' // if you need only sortable widget.

window.jQuery = $;
window.$ = $; // lazy fix if you want to use jQuery in your inline scripts.
Stanley Shauro
quelle
Danke, Stanley! Ihre zweite Lösung mit dem Hinzufügen eines Alias ​​hat für mich funktioniert
Anton Koning
14

Die akzeptierte Antwort funktioniert bei mir nicht, da das jQuery-ui-Paket auf NPM nicht vorgefertigt ist und daher keine enthält jquery-ui.js. Das Paket muss entweder vor der Verwendung erstellt werden oder alle Widgets müssen einzeln enthalten / verwendet werden.

Am schnellsten habe ich das gesamte Paket zum Laufen gebracht, indem ich zuerst die verteilbare Version heruntergeladen habe:

npm install jquery-ui-dist --save

Ich musste einen Alias ​​hinzufügen jquery-ui-dist, um den Fehler "Modul kann nicht gefunden werden" zu vermeiden (die Verwendung require('jquery-ui-dist')funktioniert einfach nicht, da der Dateiname .js unterschiedlich ist), indem ich diesen zu Folgendem hinzufügte webpack.config.js:

resolve: {
    alias: {
        'jquery-ui': 'jquery-ui-dist/jquery-ui.js'
    }
},

Schließlich können Sie dies in der .js-Datei verwenden, in die die Module geladen werden:

var jQuery = require('jquery');
require('jquery-ui'); 

Alternativ können Sie vermeiden, dass Sie requirebeim Laden der Module die Skripte verwenden und jQuery als Variable deklarieren müssen, indem Sie ProvidePlugin in Ihrer webpack.config.js verwenden:

 plugins: [
    new webpack.ProvidePlugin({
        'jQuery': 'jquery',
        '$': 'jquery',
        'global.jQuery': 'jquery'
    })
],
chrBrd
quelle
Ich kann es nicht zum Laufen bringen. Mit webpack.ProvidePlugin werden die Variablen "jQuery" und "$" korrekt für das Fenster verfügbar gemacht, jedoch ohne die Addons "jquery-ui". Wenn ich console.log ($. UI), gibt es undefiniert. @chrBrd eine Idee? Welche Version des Webpacks haben Sie verwendet?
Simone Mazzoni
Es wäre Version 1.x gewesen? - Was auch immer aktuell war, als ich die Antwort schrieb. Funktioniert es, wenn Sie requireanstelle von ProvidePlugin verwenden?
ChrBrd
1
Sie können require('jquery-ui-dist/jquery-ui.js');anstelle des Alias ​​verwenden.
Raphael
3

Die Schritte, die für mich (in einem Rails 5.1.6-Projekt) funktioniert haben, sind mit keinem der oben genannten identisch:

Installieren Sie jquery und jquery-ui: yarn add jqueryundyarn add jquery-ui

Fügen Sie der Webpack-Konfiguration (dh in /config/webpack/environment.js) Folgendes hinzu, um $ und jquery und jQuery global festzulegen:

environment.plugins.prepend(
  'Provide',
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery',
    jquery: 'jquery'
  })
)

Benötigen Sie die gewünschten individuellen jquery-ui-Pakete oben in Ihrem Paket (z. B. oben in /javascript/packs/application.js:

require("jquery-ui/ui/widgets/sortable")

Dann können Sie zum Beispiel $('.selector').sortable()überall in Ihrem Rucksack anrufen .

Ollie HM
quelle
0

füge jquery in deine node_modules hinzu mit;

npm install --save jquery jquery-ui

und fügen Sie externe Elemente in Ihre webpack.config.js wie;

...

  externals: {
// require("jquery") is external and available
//  on the global var jQuery
"jquery": "jQuery",
"jquery-ui": "jquery-ui/jquery-ui.js", 
}

es hat bei mir funktioniert

GameChanger
quelle