Phoenix Webpack React
Introduction
前回の記事でPhoenix + BrunchでReactをインストールする方法を説明したが、今回はBrunchではなく、Phoenix + WebpackでReactをインストール方法を紹介します。
Version
Phoenix: v1.1.4
React: v0.14.7
ReactDOM: v0.14.7
インストール
Webpackのインストール
npm install --save-dev webpackBabelのインストール
npm install --save-dev babel-loader babel-core babel-preset-es2015Reactのインストール
npm install --save-dev react react-dom
npm install --save-dev babel-preset-reactCSS/SASSのインストール
$ npm install --save-dev css-loader style-loader extract-text-webpack-plugin
$ npm install --save-dev bootstrap-sass node-sass sass-loader url-loader file-loadercopy-webpack-pluginインストール
$ npm install --save-dev copy-webpack-plugin新しいプロジェクトを作る
$ mix phoenix.new phoenix_react
$ cd phoenix_react
$ rm brunch-config.js設定ファイル
package.jsonに
    "phoenix": "file:deps/phoenix",
    "phoenix_html": "file:deps/phoenix_html",と
  "scripts": {
    "compile": "webpack -p"
  }を追加、完成したファイルは以下のようになる:
{
  "repository": {},
  "dependencies": {
    "phoenix": "file:deps/phoenix",
    "phoenix_html": "file:deps/phoenix_html",
  },
  "devDependencies": {
    "babel-core": "^6.5.1",
    "babel-loader": "^6.2.2",
    "babel-preset-es2015": "^6.5.0",
    "babel-preset-react": "^6.5.0",
    "bootstrap-sass": "^3.3.6",
    "copy-webpack-plugin": "^1.1.1",
    "css-loader": "^0.23.1",
    "extract-text-webpack-plugin": "^1.0.1",
    "file-loader": "^0.8.5",
    "node-sass": "^3.4.2",
    "react": "^0.14.7",
    "react-dom": "^0.14.7",
    "sass-loader": "^3.1.2",
    "style-loader": "^0.13.0",
    "url-loader": "^0.5.7",
    "webpack": "^1.12.12"
  },
  "scripts": {
    "compile": "webpack -p"
  }
}config/dev.exsにwatchersの部分を以下のように変更:
watchers: [node: ["node_modules/webpack/bin/webpack.js",
                   "--watch-stdin", "--progress", "--colors"]]webpack.config.js
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
  devtool: 'source-map',
  entry: [
    './web/static/js/app.js',
    './web/static/css/app.scss',
  ],
  output: {
    path: './priv/static',
    filename: 'js/app.js',
  },
  resolve: {
    modulesDirectories: [
      './web/static/js',
      './node_modules',
    ],
    extensions: ['', '.js', '.jsx'],
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel',
        query: {
          presets: ['es2015', 'react'],
        },
      },
      {
        test: /\.jsx$/,
        exclude: /node_modules/,
        loader: 'babel',
        query: {
          presets: ['es2015', 'react'],
        },
      },
      {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract('style', 'css'),
      },
      {
        test: /\.scss$/,
        loader: ExtractTextPlugin.extract('style', 'css!sass'),
      }
    ],
  },
  plugins: [
    new ExtractTextPlugin('css/app.css'),
    new CopyWebpackPlugin([{ from: './web/static/assets' }]),
  ],
};cssの設定
web/static/js/app.jsの中に、以下のコードを追加:
require('../css/app.scss');web/static/css/app.cssのファイル名をapp.scssに変更
app.scssの中身を以下のように修正:
$icon-font-path: "~bootstrap-sass/assets/fonts/bootstrap/";
@import "~bootstrap-sass/assets/stylesheets/_bootstrap.scss";