webpackwebpackを使い始める


備考

Webpackは、依存関係を持つモジュールを読み取り、それらのモジュールを表す静的資産を生成するモジュールバンドラです。

バンドルにJavascriptアセットだけでなく、CSS、イメージ、HTMLなどを含めることができる拡張可能なローダーシステムを備えています。

たとえば、組み込みのJavascriptローダーであるcss-loaderurl-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

バンドルされた単一のファイルになる:

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

依存関係は、最も一般的なモジュールスタイル(CommonJS&AMD)で定義できます。

バージョン

バージョン発売日
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

Javascript + CSS +フォント+画像の例

必要なモジュール

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

フォルダ構造

.
└── 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/**/*.*') では、imagesフォルダ内のすべてのファイルがエントリとして必要になります。

ExtractTextPlugin は生成された出力を取得し、バンドルされたcss ファイルを作成します。

babelを使用したwebpack.config.jsの例

依存関係

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

インストール

前提条件:

NodeJSnpm

Webpackをインストールするには、グローバルに、またはプロジェクトごとに2つの方法があります。プロジェクト毎に異なるバージョンのWebpackを使用できるため、ユーザーがWebpackをグローバルにインストールする必要はないため、プロジェクトごとに依存関係をインストールすることをお勧めします。

プロジェクトごとのインストール

プロジェクトのルートフォルダから次のコマンドを実行します。

npm install webpack --save-dev
 

あなたは、その後にインストールさWebPACKの実行ファイルを実行することができnode_modules

./node_modules/.bin/webpack
 

またはpackage.json ファイルにNPMスクリプトを作成してください。ここでnode_modules 部分は省略できます.npmはそのフォルダをPATHに含めることができるほどスマートです。

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

// from terminal:
npm start
 

グローバルにインストールする

プロンプトで次のコマンドを実行します。

npm install webpack -g
 

Node.jsを使用した簡単なWebpackセットアップ

フォルダ構造

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

注意

npm i --save-devを実行して依存関係をインストールする

依存関係がインストールされると、 \ node_modules \ webpack \ bin \ webpack.jsノードを実行します。

ノードwebserver.jsを実行してサーバーを起動する

Webpackの簡単な例

Webpackを使用するために最低限必要なのは、次のコマンドです。

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

// this is equivalent to:

webpack source-file destination-file
 

Webパックはソースファイルを受け取り、出力先にコンパイルし、ソースファイル内の依存関係を解決します。

Webpack、React JSX、Babel、ES6、シンプルな設定

正しいnpmの依存関係をインストールしてください(babelはパッケージの一部に分割することを決めました。これは "ピア依存関係"と関係します)。

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 は、 node_modules をスキャンし、フロントエンドコードとともにトランスポートされバンドルされないようにする機能です。ただし、バンドルがそれらを参照していることを保証します。これは、ライブラリーを再エンコードしていないので、より速く移送するのに役立ちます。