サーバーサイド用のNode.jsのソースコードをWebpackでプリコンパイル&バンドルした際に少しハマったので備忘録的に残しておきたいと思います。
ぼくの場合は、Node.jsのサーバーでReactのサーバーサイドレンダリングをする時に必要になりました。クライアントのソースコードがES2015だったりJSX使って書いてるのでそれをサーバーサイドで実行するのにWebpackしておく必要があったという感じです。
Webpackの設定
少し余計なものが入ってますが、webpack.config.jsは下記のような感じで動いています。
const webpack = require('webpack'); require('dotenv').config({ path: __dirname +'/.env' }); const env = process.env; const nodeExternals = require('webpack-node-externals'); module.exports = { name: 'server', target: 'node', externals: [nodeExternals()], entry: { main: './server1.js' }, output: { filename: './server1.bundle.js' }, plugins: [new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), __DEBUG__: env.APP_DEBUG === 'true' })], module: { loaders: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, loader: 'babel', query: { cacheDirectory: true, plugins: ['transform-runtime'], presets: ['es2015', 'react', 'stage-0'] } }, { test: /\.json$/, loader: 'json-loader', } ] } }
特に必要だったものとして下記があります。
target=node
targetをnodeにしないとダメです。
webpack-node-externals
externalsの設定をするのに利用します。下記のように設定しておかないとnode_modulesの中のものまでWebpackが取り込もうとしてしまうようです。
externals: [nodeExternals()],
json-loader
webpack-node-externalsの設定をしていれば不要かもしれません。プリコンパイルの過程でjsonファイルを読み込む際にエラーになってしまったので必要でした。
package.jsonの設定
package.jsonは下記のような感じで動くと思います。色々不要なものが入ってます。試す場合はご自分の環境や用途に読み替えて頂ければと思います。
{ "private": true, "devDependencies": { "chai": "^3.5.0", "gulp-mocha": "^2.2.0" }, "dependencies": { "babel": "^6.5.2", "babel-core": "^6.7.6", "babel-eslint": "^6.0.4", "babel-loader": "^6.2.4", "babel-plugin-transform-runtime": "^6.9.0", "babel-preset-es2015": "^6.6.0", "babel-preset-react": "^6.5.0", "babel-preset-stage-0": "^6.5.0", "babel-runtime": "^6.9.0", "dotenv": "^2.0.0", "express": "^4.14.0", "json-loader": "^0.5.4", "react": "15.3.0", "react-dom": "15.3.0", "webpack": "^1.13.0", "webpack-node-externals": "^1.3.3" } }