DEV

webpack2でReactを使う

webpacke2でReactの開発環境を作る。

フォルダ・ファイルを作る

$ mkdir react1 $ cd react1 $ mkdir src $ mkdir public $ touch public/index.html $ touch src/index.js $ touch webpack.config.js $ touch postcss.config.js

インストール

$ npm init -y $ npm i -D webpack webpack-dev-server $ npm i -D babel-loader babel-core babel-plugin-syntax-dynamic-import babel-preset-es2015 babel-preset-react $ npm i -D extract-text-webpack-plugin $ npm i -D style-loader css-loader postcss postcss-loader autoprefixer cssnano precss react-css-modules $ npm i -D react react-dom

package.jsonは下記のようになった。

{
"name": "react1",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"autoprefixer": "^6.7.7",
"babel-core": "^6.24.0",
"babel-loader": "^6.4.1",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"babel-preset-es2015": "^6.24.0",
"babel-preset-react": "^6.23.0",
"css-loader": "^0.27.3",
"cssnano": "^3.10.0",
"extract-text-webpack-plugin": "^2.1.0",
"postcss": "^5.2.16",
"postcss-loader": "^1.3.3",
"precss": "^1.4.0",
"react": "^15.4.2",
"react-css-modules": "^4.1.0",
"react-dom": "^15.4.2",
"style-loader": "^0.16.0",
"webpack": "^2.3.1",
"webpack-dev-server": "^2.4.2"
}
}

webpack.config.jsを作る

var path = require('path');
const webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
entry: path.resolve(__dirname, 'src/index.js'),
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'public')
},
devServer: {
contentBase: path.resolve(__dirname, 'public'),
port: 8080,
},
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: [
'css-loader',
'postcss-loader'
],
})
},
{
test: /\.js$/,
use: [{
loader: 'babel-loader',
options: {
presets: [
['es2015', {modules: false}],
'react'
],
plugins: ['syntax-dynamic-import']
}
}]
}
]
},
plugins: [
new ExtractTextPlugin('styles.css'),
new webpack.optimize.UglifyJsPlugin({
beautify: false,
mangle: {
screw_ie8: false,
keep_fnames: false
},
compress: {
screw_ie8: true
},
comments: false
})
]
};

postcss.config.jsを作る

module.exports = {
plugins: [
require('autoprefixer')({}),
require('cssnano')({}),
require('precss')({}),
require('react-css-modules')({})
]
}

public/index.htmlを作る

<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>React App</title>
</head>
<body>
<div id="root"></div>
<script src="bundle.js"></script>
</body>
</html>

src/index.jsを作る

import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);

webpackを実行する。実行後、public/bundle.jsが作成される。

$ webpack

webpack-dev-serverを実行する。実行後、http://localhost:8080にアクセスすると確認できる。

$ webpack-dev-server