React 16の新しいライフサイクルメソッドに関する記事はネット上に多いが、実戦経験に基づいたものは少ない。この記事では実際のプロジェクトからベストプラクティスを探る。
基本的な使い方
実際の例を見てみよう:
javascript
const express = require("express");
const app = express();
// ミドルウェア
app.use(express.json());
function errorHandler(err, req, res, next) {
console.error(err.stack);
res.status(500).json({
error:
process.env.NODE_ENV === "production" ? "サーバーエラー" : err.message,
});
}
app.get("/api/users", async (req, res, next) => {
try {
const users = await User.find();
res.json(users);
} catch (err) {
next(err);
}
});
app.use(errorHandler);
このパターンをチームに広めた後、結果は良好でメンテナンスコストが明らかに低下した。
応用的なテクニック
以下の方法で実現できる:
javascript
const http = require("http");
const cluster = require("cluster");
const os = require("os");
if (cluster.isMaster) {
const numWorkers = os.cpus().length;
console.log(
`マスタープロセス ${process.pid}、${numWorkers}個のワーカーを起動`,
);
for (let i = 0; i < numWorkers; i++) {
cluster.fork();
}
cluster.on("exit", (worker) => {
console.log(`ワーカー ${worker.process.pid} 終了、再起動中`);
cluster.fork();
});
} else {
http
.createServer((req, res) => {
res.end(`Worker ${process.pid}`);
})
.listen(3000);
}
上記コードのパフォーマンスの詳細に注意し、不要な計算を避けること。
実践事例
以下の実装を参考にしてほしい:
javascript
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "[name].[contenthash:8].js",
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: "babel-loader",
},
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
],
},
optimization: {
splitChunks: {
chunks: "all",
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: "vendors",
},
},
},
},
plugins: [
new HtmlWebpackPlugin({ template: "./src/index.html" }),
new MiniCssExtractPlugin({ filename: "[name].css" }),
],
};
本番環境での検証済みで、安定して動作している。