Einmal 42 und zurück > Webpack mit SnapSVG
Webpack mit SnapSVG
Snap verhält sich ein wenig zickig, wenn man es zusammen mit Webpack verwenden möchte. Diese Default-Konfiguration zeigt, wie es doch geht.
var path = require('path');
var webpack = require('webpack');
var js_path = "src/Resources/js";
var ts_path = "src/Resources/ts";
module.exports = {
module: {
rules: [{
/* Regel für normale JavaScript-Dateien, die sich innerhalb
von src/Resources/js befinden. Die Dateien werden mittels
babel-loader auf die letzten 2 Browserversionen "kompatibilisiert". */
loader: "babel-loader",
include: [ // Regel gilt nur für diesen Pfad
path.resolve(__dirname, js_path),
],
// Nur `.js` and `.jsx` Dateien durch Babel schicken
test: /\.jsx?$/,
// Babel-Optionen
query: {
// plugins: ['transform-runtime'],
presets: [
['env', {
targets: {
"browsers": ["last 2 versions", "ie >= 9"]
}
}]
],
}
},
{
/* Regel für TypeScript Dateien, die in src/Resources/ts
oder innerhalb von node_modules sind.*/
test: /\.tsx?$/,
use: 'ts-loader',
include: [
path.resolve(__dirname, ts_path),
path.resolve(__dirname, "node_modules"),
],
},
{
/* Sonderregel für jquery. Dafür sorgen, dass die jQuery-Symbole
$ sowie jQuery im globalen Namespace landen. Das ist für
Skripte, die inline in HTML-Dateien sind, notwendig.
Über das webpack.ProvidePlugin (Beispiel siehe unten) klappt das
zwar in .js Dateien aber nicht im inline-js. */
test: /jquery-[0-9\.]*\.js/,
use: [{
loader: 'expose-loader',
options: '$'
},
{
loader: 'expose-loader',
options: 'jQuery'
},
]
},
{
/* Snap im Kompatibilitätsmodus importieren. Snap
erwartet, dass this auf das aktuelle window zeigt. Zudem enthält die
index.d.ts keine Moduldefinition. Daher müssen die module.exports
automatisch ergänzt werden.*/
test: require.resolve('snapsvg/dist/snap.svg.js'),
use: [
'imports-loader?this=>window,fix=>module.exports=0',
],
},
],
},
/* Ausgabepfad konfigurieren */
output: {
path: path.resolve(__dirname, 'public/js'),
filename: 'main.js'
},
/* Verzeichnisse konfigurieren, in denen die Module gesucht werden.*/
resolve: {
modules: [
'node_modules',
js_path,
ts_path
],
extensions: [ '.ts', '.js' ],
/* Bibliotheken auf die konkrete Version verlinken. */
alias: {
'jquery': 'jquery-3.2.1.js',
'snapsvg': 'snapsvg/dist/snap.svg.js',
}
},
/* Entry-Punkte definieren. Diese Dateien werden auch includet,
selbst wenn sie von nirgendwo referenziert werden.
Wird für einen Einsprung von inline-JS in HTML-Dateien benötigt.*/
entry: [
'./src/Resources/js/filtertable.js',
'./src/Resources/js/jstree.js',
'./src/Resources/js/graph.js',
'jquery',
'snapsvg',
],
/* Einstellen, welche Form von Source-Maps erzeugt werden sollen. Siehe
https://webpack.js.org/configuration/devtool/ */
devtool: 'source-map',
plugins: [
/* Symbole in alles .js Dateien zur Verfügung stellen. Dieses plugin
wirkt sich NICHT auf inline-javascript aus und wird deshalb hier
nicht verwendet! */
/*
new webpack.ProvidePlugin({
'$': "jquery",
jQuery: "jquery",
'window.$': 'jquery'
})
*/
],
watchOptions: {
aggregateTimeout: 300, // 300ms Verzögerung bei Änderungen um nachfolgende Speichervorgänge zusammenzufassen
poll: 1000, // Alle 1000ms auf Änderungen prüfen
ignored: /node_modules/ // Verzeichnis node_modules ignorieren
},
};