webpack Zelfstudie
Aan de slag met webpack
Zoeken…
Opmerkingen
Webpack is een modulebundler die modules met afhankelijkheden leest en statische activa produceert die deze modules vertegenwoordigen.
Het beschikt over een uitbreidbaar ladersysteem waarmee bundels niet alleen Javascript-middelen, maar CSS, afbeeldingen, HTML en nog veel meer kunnen bevatten.
Bijvoorbeeld met behulp van de ingebouwde Javascript-lader, css-loader en url-loader :
require("./code.js") // Load Javascript dependency
var css = require("./styles.css"); // Load CSS as a string
var base64Image = require("./image.png"); // Load an image as a base64 string
Zou een enkel gebundeld bestand worden:
// From code.js
console.log("Hello, World");
// From styles.css
var css = "body { margin: 0; padding: 0; } h1 { color: #FF0000; }";
// From image.png
var base64Image = "data:image/gif;base64,R0lGODlhPQBEAPeoAJosM//AwO/AwHVYZ/z595kzAP/s7P+goOXMv8+fhw/v739/f+8PD98fH/8mJl+fn/9ZWb8/PzWlwv///6wWGbImAPgTEMImIN9gUFCEm/gDALULDN8PAD6atYdCTX9gUNKlj8wZAKUsAOzZz+UMAOsJAP/Z2ccMDA8PD/95eX5NWvsJCOVNQPtfX/8zM8+QePLl38MGBr8JCP+zs9myn/8GBqwpAP/GxgwJCPny78lzYLgjAJ8vAP9fX...";
Afhankelijkheden kunnen worden gedefinieerd in een van de meest voorkomende modulestijlen (CommonJS en AMD).
versies
Versie | Publicatiedatum |
---|---|
3.0.0 | 2017/06/19 |
2.6.1 | 2017/05/25 |
2.6.0 | 2017/05/23 |
2.5.1 | 2017/05/07 |
2.5.0 | 2017/05/04 |
2.4.1 | 2017/04/14 |
2.4.0 | 2017/04/14 |
1.13 | 2016/04/17 |
1.12 | 2015/08/25 |
1.11 | 2015/08/06 |
1.10 | 2015/06/27 |
1.9 | 2015/05/10 |
1.8 | 2015/04/29 |
1.7 | 2015/03/11 |
1.6 | 2015/02/24 |
1.5 | 2015/01/21 |
1.4 | 2014/12/28 |
1.3 | 2014/08/25 |
1.2 | 2014/05/27 |
1.1 | 2014/05/17 |
1.0 | 2014/03/01 |
0.11 | 2013/12/31 |
0.10 | 2013/06/19 |
0.9 | 2013/03/19 |
0.8 | 2013/01/21 |
Installatie
Vereisten:
Er zijn twee manieren om Webpack te installeren: globaal of per project. Het is het beste om de afhankelijkheid per project te installeren, omdat u hierdoor verschillende versies van webpack voor elk project kunt gebruiken en niet vereist dat de gebruiker webpack wereldwijd moet hebben geïnstalleerd.
Installatie per project
Voer de volgende opdracht uit vanuit de hoofdmap van uw project:
npm install webpack --save-dev
U kunt het uitvoerbare webpack vervolgens uitvoeren op node_modules
:
./node_modules/.bin/webpack
Of maak een NPM-script in uw package.json
bestand, waar u het gedeelte node_modules
kunt weglaten - npm is slim genoeg om die map in zijn PATH op te nemen.
// in package.json:
{
...
"scripts": {
"start": "webpack"
},
...
}
// from terminal:
npm start
Wereldwijd installeren
Voer de volgende opdracht uit bij een prompt:
npm install webpack -g
Voorbeeld van webpack.config.js met babel
afhankelijkheden
npm i -D webpack babel-loader
webpack.config.js
const path = require('path');
module.exports = {
entry: {
app: ['babel-polyfill', './src/'],
},
output: {
path: __dirname,
filename: './dist/[name].js',
},
resolve: {
extensions: ['', '.js'],
},
module: {
loaders: [{
test: /\.js$/,
loaders: ['babel-loader'],
include: path.resolve(__dirname, 'src')
}],
}
};
Voorbeeld van Javascript + CSS + Fonts + afbeeldingen
Vereiste modules
npm install --save-dev webpack extract-text-webpack-plugin file-loader css-loader style-loader
Mappenstructuur
.
└── assets
├── css
├── images
└── js
webpack.config.js
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const path = require('path');
const glob = require('glob');
module.exports = {
entry: {
script: path.resolve(__dirname, './assets/js/app.js'),
style: path.resolve(__dirname, './assets/css/app.css'),
images: glob.sync(path.resolve(__dirname, './assets/images/**/*.*')),
},
context: __dirname,
output: {
path: path.resolve('./dist/assets'),
publicPath: '/dist/assets',
filename: '[name].js',
},
module: {
loaders: [
{
test: /\.css$/,
loader: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: 'css-loader'
}),
},
{
test: /(\.woff2?|\.woff|\.ttf|\.eot|\.svg)(\?v=\d+\.\d+\.\d+)?$/,
loader: 'file-loader?name=[name]-[hash:6].[ext]',
},
{
test: /\.(png|jpe?g|gif|ico)$/,
loader: 'file-loader?name=[name].[ext]',
},
],
},
plugins: [
new ExtractTextPlugin('app.css' /* optional: , { allChunks: true } */),
],
};
glob.sync('./assets/images/**/*.*')
vereist alle bestanden in de map images als invoer.
ExtractTextPlugin
pakt de gegenereerde output en maakt een gebundeld css
bestand.
Webpack eenvoudig voorbeeld
Het minimum dat vereist is om Webpack te gebruiken, is de volgende opdracht:
webpack ./src/index.js ./dist/bundle.js
// this is equivalent to:
webpack source-file destination-file
Webpakket neemt het bronbestand, compileert naar de uitvoerbestemming en lost eventuele afhankelijkheden in de bronbestanden op.
Webpack, React JSX, Babel, ES6, eenvoudige configuratie
Zorg ervoor dat u de juiste npm-afhankelijkheden installeert (babel besloot zichzelf te splitsen in een aantal pakketten, iets dat te maken heeft met "peer-afhankelijkheden"):
npm install webpack webpack-node-externals babel-core babel-loader babel-preset-react babel-preset-latest --save
webpack.config.js
:
module.exports = {
context: __dirname, // sets the relative dot (optional)
entry: "./index.jsx",
output: {
filename: "./index-transpiled.js"
},
module: {
loaders: [{
test: /\.jsx$/,
loader: "babel?presets[]=react,presets[]=latest" // avoid .babelrc
}]
}, // may need libraryTarget: umd if exporting as a module
externals: [require("webpack-node-externals")()], // probably not required
devtool: "inline-source-map"
};
webpack-node-externals
is een functie die uw node_modules
scant en ervoor zorgt dat ze niet worden transpiled en gebundeld samen met uw front-end code, hoewel het ervoor zorgt dat de bundel ernaar verwijst. Dit helpt bij snellere transpilatie, omdat u bibliotheken niet opnieuw codeert.
Eenvoudige webpackconfiguratie met Node.js
Mapstructuur
.
├── lib
├── modules
| ├── misc.js
| ├── someFunctions.js
├── app.js
├── index.html
├── package.json
├── webpack.config.js
└── webserver.js
package.json
{
"name": "webpack-example-with-nodejs",
"version": "1.0.0",
"description": "Example using webpack code-splitting with some Node.js to support the example",
"main": "webserver.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "@Gun",
"license": "ISC",
"devDependencies": {
"body-parser": "^1.17.1",
"express": "^4.15.2",
"http": "0.0.0",
"morgan": "^1.8.1",
"multer": "^1.3.0",
"webpack": "^2.4.1"
}
}
webpack.config.js
var path = require('path'); // used to get context
module.exports = {
context: path.join(__dirname, 'app'), // resolves entry below, must be absolute path
entry: './app.js', // entry point or loader for the application
output: {
path: path.join(__dirname, 'app/lib'), // express static folder is at /app/lib
filename: '[name].bundle.js', // the file name of the bundle to create. [name] is replaced by the name of the chunk (code-splitting)
publicPath: 'static' // example uses express as the webserver
}
};
webserver.js
var express = require('express'),
path = require('path'),
bodyParser = require('body-parser'),
multer = require('multer')()
logger = require('morgan'),
fs = require('fs'),
http = require('http');
var app = express();
var port = 31416;
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(logger('short'));
app.use('/jsBundles',express.static('lib'));
app.get('/', function(request, response){
response.sendFile(__dirname + '/index.html');
});
var server = http.createServer(app).listen(port, function(){
console.log("I feel a disturbance in the port:" + port);
});
index.html
<!DOCTYPE html>
<html>
<body>
<div id="someValue"><label for="num">Enter a number:</label><input id="num" /></div>
<div class="buttonList">
<ul>
<li><button id="doubleIt">double it</button></li>
<li><button id="tripleIt">triple it</button></li>
</ul>
</div>
<div id="someOtherValue">
And the count shall be: <span id="theCount"></span>
</div>
<script src="/jsBundles/main.bundle.js"></script>
</body>
</html>
app.js
require(['./modules/someFunctions'],function(){
window.onload = function(){
var someFunctions = require('./modules/someFunctions');
document.getElementById('doubleIt').onclick = function(){
var num = document.getElementById('num').value;
document.getElementById('theCount').innerHTML = someFunctions.Double(num);
};
document.getElementById('tripleIt').onclick = function(){
var num = document.getElementById('num').value;
document.getElementById('theCount').innerHTML = someFunctions.Triple(num);
};
};
});
misc.js
var self = {};
self.isNumber = function(value){
// http://stackoverflow.com/questions/9716468/is-there-any-function-like-isnumeric-in-javascript-to-validate-numbers
return !isNaN(parseFloat(value)) && isFinite(value);
};
module.exports = self;
someFunctions.js
require(['./misc'], function(){
var misc= require('./misc');
var self = {};
self.Double = function(value){
if(!misc.isNumber(value)){
return 0;
};
return value*2;
}
self.Triple = function(value){
if(!misc.isNumber(value)){
return 0;
};
return value*3;
}
module.exports = self;
});
NOTITIE
voer npm i - save-dev uit om afhankelijkheden te installeren
voer knoop uit. \ node_modules \ webpack \ bin \ webpack.js zodra de afhankelijkheden zijn geïnstalleerd
voer knoop webserver.js uit om de server te starten