Antworten:
Es gibt verschiedene Möglichkeiten, sich den Globalen zu nähern:
Webpack wertet Module nur einmal aus, sodass Ihre Instanz global bleibt und Änderungen von Modul zu Modul durchführt. Wenn Sie also so etwas wie a erstellen globals.js
und ein Objekt aller Ihrer Globals exportieren, können Sie import './globals'
diese Globals lesen und schreiben. Sie können in ein Modul importieren, Änderungen am Objekt von einer Funktion vornehmen und in ein anderes Modul importieren und diese Änderungen in einer Funktion lesen. Denken Sie auch an die Reihenfolge, in der die Dinge passieren. Webpack nimmt zuerst alle Importe und lädt sie in der Reihenfolge ab Ihrem entry.js
. Dann wird es ausgeführt entry.js
. Es ist also wichtig, wo Sie in Globals lesen / schreiben. Ist es aus dem Stammbereich eines Moduls oder in einer später aufgerufenen Funktion?
Hinweis : Wenn die Instanz new
jedes Mal sein soll, verwenden Sie eine ES6-Klasse . Traditionell würden Sie in JS Klassen (im Gegensatz zu Kleinbuchstaben für Objekte) wie groß schreiben
import FooBar from './foo-bar' // <-- Usage: myFooBar = new FooBar()
So können Sie dies mit dem ProvidePlugin von Webpack tun (das ein Modul als Variable in jedem Modul und nur in den Modulen zur Verfügung stellt, in denen Sie es tatsächlich verwenden). Dies ist nützlich, wenn Sie nicht immer import Bar from 'foo'
wieder tippen möchten . Oder Sie können in einem Paket wie jQuery bringen oder als globale lodash hier (auch wenn Sie einen Blick auf Webpack die nehmen könnte Externals ).
Schritt 1) Erstellen Sie ein beliebiges Modul. Zum Beispiel wäre eine globale Reihe von Dienstprogrammen praktisch:
utils.js
export function sayHello () {
console.log('hello')
}
Schritt 2) Aliasen Sie das Modul und fügen Sie es zu ProvidePlugin hinzu:
webpack.config.js
var webpack = require("webpack");
var path = require("path");
// ...
module.exports = {
// ...
resolve: {
extensions: ['', '.js'],
alias: {
'utils': path.resolve(__dirname, './utils') // <-- When you build or restart dev-server, you'll get an error if the path to your utils.js file is incorrect.
}
},
plugins: [
// ...
new webpack.ProvidePlugin({
'utils': 'utils'
})
]
}
Rufen Sie jetzt einfach eine utils.sayHello()
beliebige js-Datei auf und es sollte funktionieren. Stellen Sie sicher, dass Sie Ihren Dev-Server neu starten, wenn Sie dies mit Webpack verwenden.
Hinweis: Vergessen Sie nicht, Ihrem Linter das Globale mitzuteilen, damit er sich nicht beschwert. Siehe zum Beispiel meine Antwort für ESLint hier .
Wenn Sie nur const mit Zeichenfolgenwerten für Ihre Globals verwenden möchten, können Sie dieses Plugin zu Ihrer Liste der Webpack-Plugins hinzufügen:
new webpack.DefinePlugin({
PRODUCTION: JSON.stringify(true),
VERSION: JSON.stringify("5fa3b9"),
BROWSER_SUPPORTS_HTML5: true,
TWO: "1+1",
"typeof window": JSON.stringify("object")
})
Verwenden Sie es wie:
console.log("Running App version " + VERSION);
if(!BROWSER_SUPPORTS_HTML5) require("html5shiv");
window.foo = 'bar' // For SPA's, browser environment.
global.foo = 'bar' // Webpack will automatically convert this to window if your project is targeted for web (default), read more here: https://webpack.js.org/configuration/node/
Sie werden sehen, dass dies häufig für Polyfills verwendet wird, zum Beispiel: window.Promise = Bluebird
(Für serverseitige Projekte) Das dotenv-Paket verwendet eine lokale Konfigurationsdatei (die Sie zu Ihrem .gitignore hinzufügen können, wenn Schlüssel / Anmeldeinformationen vorhanden sind) und fügt Ihre Konfigurationsvariablen dem process.env- Objekt von Node hinzu .
// As early as possible in your application, require and configure dotenv.
require('dotenv').config()
Erstellen Sie eine .env
Datei im Stammverzeichnis Ihres Projekts. Fügen Sie in neuen Zeilen umgebungsspezifische Variablen in Form von hinzu NAME=VALUE
. Beispielsweise:
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
Das ist es.
process.env
hat jetzt die Schlüssel und Werte, die Sie in Ihrer .env
Datei definiert haben .
var db = require('db')
db.connect({
host: process.env.DB_HOST,
username: process.env.DB_USER,
password: process.env.DB_PASS
})
Verwenden Sie Webpacks Externals , wenn Sie einige Module von der Aufnahme in Ihr erstelltes Bundle ausschließen möchten. Webpack stellt das Modul global zur Verfügung, fügt es jedoch nicht in Ihr Bundle ein. Dies ist praktisch für große Bibliotheken wie jQuery (da das Schütteln externer Pakete in Webpack nicht funktioniert ), bei denen diese bereits in separaten Skript-Tags (möglicherweise von einem CDN) auf Ihre Seite geladen sind.
externals
stattdessen einfach, wenn Sie eine globale Variable erstellen müssen. Beispiel: externals: { 'webpackVariables': `{ serverUrl: '${ env.server }', cordovaBuild: '${ env.cordova }', }`, },
Dann verwenden Sie es alsconst webpackVariables = require('webpackVariables');
declare const isProduction: bool;
Als Referenz check this out typescriptlang.org/docs/handbook/declaration-files/templates/...
Ich wollte gerade die gleiche Frage stellen. Nachdem ich ein bisschen weiter gesucht und einen Teil der Dokumentation des Webpacks entschlüsselt habe, denke ich, dass Sie das output.library
und output.libraryTarget
in der webpack.config.js
Datei wollen.
Beispielsweise:
js / index.js:
var foo = 3;
var bar = true;
webpack.config.js
module.exports = {
...
entry: './js/index.js',
output: {
path: './www/js/',
filename: 'index.js',
library: 'myLibrary',
libraryTarget: 'var'
...
}
Wenn Sie nun die generierte www/js/index.js
Datei in einem HTML-Skript-Tag verknüpfen , können Sie myLibrary.foo
von überall in Ihren anderen Skripten darauf zugreifen .
export { foo }
im index.js
?
Verwenden Sie DefinePlugin .
Mit dem DefinePlugin können Sie globale Konstanten erstellen, die zur Kompilierungszeit konfiguriert werden können.
new webpack.DefinePlugin(definitions)
plugins: [
new webpack.DefinePlugin({
PRODUCTION: JSON.stringify(true)
})
//...
]
console.log(`Environment is in production: ${PRODUCTION}`);
Sie können define verwenden window.myvar = {}
. Wenn Sie es verwenden möchten, können Sie like verwendenwindow.myvar = 1
var window.CKEDITOR_BASEPATH = {};
Fehler ist "Unerwartetes Token" nachwindow.
var
Schlüsselwort. window.CKEDITOR_BASEPATH = {};
utils
Namespace in die Zieldatei aufgenommen hatte - anfangs hatte ich nur einen Haltepunkt in den Browser eingefügt Quellfenster und ich rätselten immer wieder, warumutils
nicht definiert wurde. Schließlich entdeckte ich, dass Webpack (ziemlich intelligent) nur dann ein Modul enthält, wenn auf seinen Namespace mindestens einmal verwiesen wird. Deshalb, sobald ich mit Vorwort einer der Utility - Funktionen der Zieldatei habenutils
, das Modul wurde eingeschlossen.