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:

NodeJS och npm

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



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow