Skip to content
⚠️ This article was written in 2019. Some content may be outdated.

React 16 New Lifecycle Methods

There is no shortage of articles about React 16's new lifecycle methods online, but most lack real-world insight. This article explores best practices from actual projects.

Basic Usage

Here is a real-world example:

javascript
const express = require("express");
const app = express();

// Middleware
app.use(express.json());

function errorHandler(err, req, res, next) {
  console.error(err.stack);
  res.status(500).json({
    error: process.env.NODE_ENV === "production" ? "Server Error" : 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);

After promoting this pattern across the team, the results were great and maintenance costs dropped noticeably.

Advanced Techniques

This can be achieved with the following approach:

javascript
const http = require("http");
const cluster = require("cluster");
const os = require("os");

if (cluster.isMaster) {
  const numWorkers = os.cpus().length;
  console.log(`Master process ${process.pid}, starting ${numWorkers} workers`);

  for (let i = 0; i < numWorkers; i++) {
    cluster.fork();
  }

  cluster.on("exit", (worker) => {
    console.log(`Worker ${worker.process.pid} exited, restarting`);
    cluster.fork();
  });
} else {
  http
    .createServer((req, res) => {
      res.end(`Worker ${process.pid}`);
    })
    .listen(3000);
}

Pay attention to the performance details in the code above and avoid unnecessary computation.

Real-World Case Study

Refer to the following implementation:

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" }),
  ],
};

This setup has been validated in production and runs reliably.

MIT Licensed