DEV

webpack

webpack

参考:webpack で始めるイマドキのフロントエンド開発

webpack は WebApp に必要なリソースの依存関係を解決し、アセット(配布物)を生成するビルドツール(要するにコンパイラ)です。JavaScript だけでなく、CoffeeScript や TypeScript、CSS 系、画像ファイルなどを扱うことができます。 webpack を使えば、Grunt も Gulp も必要ありません!覚えるべきことはほとんどありません。(必要なら)簡単な設定ファイルを書いて webpack コマンドを実行するだけです。

インストール

$npm i -g webpack

これで、hoge.jsがscript.jsとして作成される。

$webpack hoge.js script.js

参考:http://webpack.github.io/docs/installation.html これを使うと簡易webサーバが立ち上げられるっぽい。

$ npm install webpack-dev-server --save-dev

参考:webpack-dev-serverの基本的な使い方とポイント 便利だな。

下記のように、package.jsonのscriptsに、webpack-dev-serverの起動を追加して、npm run webpack-dev-serverとしたらサーバが起動した。設定しないと、プロジェクトルートをwebルートにされました。

"scripts": {
"webpack-dev-server": "webpack-dev-server"
},

webpackの設定

webpack.config.jsというファイルに設定を書き込む。

webpack.config.jsを下記のようにして、webpackを実行するとできた。

module.exports = {
entry: './src/main.js',
output: {
path: __dirname + '/www/js',
filename: 'bundle.js'
}
};

devServerのcontentBaseを指定すると、webpack-dev-serverのWEBルートが変更できる。ポートも変更できるらしい。

module.exports = {
entry: './src/main.js',
output: {
path: __dirname + '/www/js',
filename: 'bundle.js'
},
devServer: {
contentBase: __dirname + '/www',
port: 8080
},
};

Hot Module Replacement(HMR)というのも便利そう。

参考:http://webpack.github.io/docs/usage.html

nativeのjavascript以外に対応させるためには、loaderというのを使うらしい。例えばbabelであれば、babel-loaderというのがある。

babelをnpmでインストールしてから、webpack.config.jsに、下記を追加する。

module: {
loaders: [{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader'
}]
},

testとかよくわからないけど、jsファイルはbabel-loader通す的な感じでしょうか?これによって、Reactとかも対応可能になるもよう。reactで試してみよう。

参考:babelとwebpackを使ってES6でreactを動かすまでのチュートリアル

main.jsを下記のようにする。

import React from 'react';
import {render} from 'react-dom';
class App extends React.Component {
render () {
return <p> Hello React!</p>;
}
}
render(<App/>, document.getElementById('example'));

これでwebpackしたら、正常に動いた。

あと、プラグインもあって、例えば、jsファイルの圧縮もある。 webpack.config.jsの最初の行に下記を追加する。

const webpack = require('webpack');

あと、webpack.config.jsに下記を追記する。

plugins: [
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false,
},
output: {
comments: false,
},
}),
]

これで圧縮された。 webpack -p とするだけで、本番用になるので、圧縮してくれるらしい。

スタイルシートもエントリーポイントのJSに組み込むらしい。 参考:http://webpack.github.io/docs/tutorials/getting-started/ 参考:タスクランナーを使わずに webpack だけでフロントエンド開発する方法

$ npm i -D css-loader style-loader

cssをmain.jsに組み込む。

require("./css/style.css");

webpack.config.jsにcss loaderの設定を追加する。

module: {
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel'
},
{
test: /\.css$/,
loader: "style!css"
}
]
},

これでできた。 webpack.config.jsに下記を追加すると、importとかするときに、拡張子をつけなくてよくなる。

resolve: {
extensions: ['', '.js', '.css']
},

あと、webpack-dev-serverは、watchしてくれているらしい。ファイルを変更すると自動的に内部的にwebpackし、その結果をメモリ上に保存するらしい。ファイル自体は作成しない。webpack-dev-serverを利用しない場合は、webpackのwatch機能を利用したらしい。

$ webpack -d --watch

-dというのは、source mapを作成してくれるものらしい。やってみる。おーでてる。bundle.js.mapが作成されました。多分watchできてそう。

あとは、コードチェックしてくれる、eslintを入れてみる。webpackで使う場合、これもloaderになる。eslint-loader。

$ npm i -D eslint-loader

どうもERROR in Cannot find module ‘eslint’というエラーがでるので、eslintは別で調べる。