webpack Handledning
Komma igång med webpack
Sök…
Anmärkningar
Webpack är en modulpaket som läser moduler med beroenden och producerar statiska tillgångar som representerar dessa moduler.
Det har ett utdragbart lastningssystem som gör att paket inte bara kan inkludera Javascript-tillgångar, utan CSS, bilder, HTML och mycket mer.
Använd till exempel den inbyggda Javascript-laddaren, css-loader och 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
Skulle bli en enda paketfil:
// 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...";
Beroende kan definieras i någon av de vanligaste modulstilarna (CommonJS & AMD).
versioner
Version | Utgivningsdatum |
---|---|
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 |
Installation
förutsättningar:
Det finns två sätt att installera Webpack: globalt eller per projekt. Det är bäst att ha beroendet installerat per projekt, eftersom det gör att du kan använda olika versioner av webpack för varje projekt och inte kräver att användaren har installerat webpack globalt.
Installera per projekt
Kör följande kommando från projektets rotmapp:
npm install webpack --save-dev
Du kan sedan köra den webpack-körbara som är installerad till node_modules
:
./node_modules/.bin/webpack
Eller skapa ett NPM-skript i din package.json
fil, där du kan utelämna delen av node_modules
- npm är smart nog att inkludera den mappen i sin PATH.
// in package.json:
{
...
"scripts": {
"start": "webpack"
},
...
}
// from terminal:
npm start
Installera globalt
Kör följande kommando snabbt:
npm install webpack -g
Exempel på webpack.config.js med babel
beroenden
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')
}],
}
};
Exempel på Javascript + CSS + typsnitt + bilder
Obligatoriska moduler
npm install --save-dev webpack extract-text-webpack-plugin file-loader css-loader style-loader
Mappstruktur
.
└── 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/**/*.*')
kräver alla filer i bildmappen som post.
ExtractTextPlugin
tag i den genererade utgången och skapar en medföljande css
fil.
Webpack enkel exempel
Det lägsta som krävs för att använda Webpack är följande kommando:
webpack ./src/index.js ./dist/bundle.js
// this is equivalent to:
webpack source-file destination-file
Webbpaket tar källfilen, sammanställer till utgångsdestinationen och löser eventuella beroenden i källfilerna.
Webpack, React JSX, Babel, ES6, enkel konfigurering
Se till att du installerar rätt npm-beroenden (babel bestämde sig för att dela upp sig själv i ett gäng paket, något att göra med "peer-beroenden"):
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
är en funktion som skannar dina node_modules
och ser till att de inte transpileras och paketeras tillsammans med din front-end-kod, även om det säkerställer att bunten behåller referens till dem. Detta hjälper till med snabbare transpilering eftersom du inte kodar om bibliotek igen.
Enkel webbpakkeinställning med Node.js
Mappstruktur
.
├── 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;
});
NOTERA
kör npm i - spara-dev för att installera beroenden
kör node. \ node_moduler \ webpack \ bin \ webpack.js när beroenden har installerats
kör noden webserver.js för att starta servern