webpackIniziare con il webpack


Osservazioni

Webpack è un bundle di moduli che legge moduli con dipendenze e produce asset statici che rappresentano quei moduli.

È dotato di un sistema di caricamento estensibile che consente ai pacchetti di includere non solo risorse Javascript, ma anche CSS, immagini, HTML e molto altro.

Ad esempio, utilizzando il caricatore di Javascript integrato, css-loader e 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

Diventerebbe un singolo file in bundle:

// 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...";

Le dipendenze possono essere definite in uno qualsiasi degli stili di modulo più comuni (CommonJS e AMD).

Versioni

Versione Data di rilascio
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

Esempio di Javascript + CSS + tipi di carattere + immagini

Moduli richiesti

npm install --save-dev webpack extract-text-webpack-plugin file-loader css-loader style-loader
 

Struttura delle cartelle

.
└── 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/**/*.*') richiederà tutti i file nella cartella images come voce.

ExtractTextPlugin acquisirà l'output generato e creerà un file css bundle.

Esempio di webpack.config.js con babel

dipendenze

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')
    }],
  }
};
 

Installazione

Prerequisiti:

NodeJS e npm

Esistono due modi per installare Webpack: globalmente o per progetto. È meglio avere la dipendenza installata per progetto, in quanto ciò consentirà di utilizzare diverse versioni di webpack per ciascun progetto e non richiedere all'utente di aver installato il webpack a livello globale.

Installazione per progetto

Esegui il seguente comando dalla cartella principale del tuo progetto:

npm install webpack --save-dev
 

È quindi possibile eseguire l'eseguibile del node_modules installato su node_modules :

./node_modules/.bin/webpack
 

O creare uno script NPM nel package.json file, dove è possibile omettere la node_modules parte - NPM è intelligente sufficienti per includere tale cartella sul suo cammino.

// in package.json:
{
  ...
  "scripts": {
    "start": "webpack"
  },
  ...
}

// from terminal:
npm start
 

Installazione a livello globale

Esegui il seguente comando al prompt:

npm install webpack -g
 

Configurazione semplice del webpack con Node.js

Struttura delle cartelle

.
├── 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;
});
 

NOTA

eseguire npm i --save-dev per installare le dipendenze

eseguire il nodo. \ node_modules \ webpack \ bin \ webpack.js una volta installate le dipendenze

eseguire il nodo webserver.js per avviare il server

Esempio semplice di Webpack

Il minimo richiesto per utilizzare Webpack è il seguente comando:

webpack ./src/index.js ./dist/bundle.js

// this is equivalent to:

webpack source-file destination-file
 

Il pacchetto Web prenderà il file sorgente, compilerà la destinazione di output e risolverà qualsiasi dipendenza nei file di origine.

Webpack, React JSX, Babel, ES6, configurazione semplice

Assicurati di installare le corrette dipendenze di npm (babel ha deciso di suddividersi in un gruppo di pacchetti, qualcosa che ha a che fare con le "dipendenze dei peer"):

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 è una funzione che esegue la scansione dei tuoi node_modules e garantisce che non siano transpiled e raggruppati insieme al tuo codice front-end, sebbene assicuri che il bundle mantenga il riferimento ad essi. Questo aiuta con una transpilazione più veloce, dal momento che non stai ri-codificando le librerie.