React系列---Webpack環境搭建(二)不一樣環境不一樣配置

React系列---Webpack環境搭建(一)手動搭建
React系列---Webpack環境搭建(二)不一樣環境不一樣配置
React系列---Webpack環境搭建(三)打包性能優化html


實際項目中,每每不一樣環境有不一樣的構建需求。好比開發、測試和生產環境對應的後端接口地址不一樣,生產環境須要進行代碼混淆、壓縮等。node

所以,每每還須要將webpack配置分紅多個:react

安裝webpack-merge,用於合併配置:webpack

npm install webpack-merge --save-dev

安裝uglifyjs-webpack-plugin,用於js代碼壓縮:git

npm install uglifyjs-webpack-plugin --save-dev

webpack -p也能夠用於代碼壓縮。相對而言,使用uglifyjs-webpack-plugin,能夠對壓縮進行更靈活的控制。github


拆分webpack.config.js爲如下幾個配置:web

基礎配置 webpack.base.config.js:npm

const path = require('path');
const webpack = require('webpack');

const ROOT_PATH = path.resolve(__dirname);
const SRC_PATH = path.resolve(ROOT_PATH, 'src');
const BUILD_PATH = path.resolve(ROOT_PATH, 'dist');

module.exports = {
    entry: {
        index: path.resolve(SRC_PATH, 'index.jsx')
    },
    output: {
        path: BUILD_PATH,
        filename: 'js/[name].[hash:5].js'
    },
    resolve: {
        extensions: ['.js', '.jsx']
    },
    module: {
        loaders: [
            {
                test: /\.jsx?$/,
                loaders: ['eslint-loader'],
                include: SRC_PATH,
                enforce: 'pre'
            }, {
                test: /\.jsx?$/,
                loaders: ['babel-loader'],
                include: SRC_PATH,
                exclude: path.resolve(ROOT_PATH, 'node_modules')
            }
        ]
    }
};

開發環境配置,webpack.dev.config.js:json

const path = require('path');
const webpack = require('webpack');
const HtmlwebpackPlugin = require('html-webpack-plugin');
const merge = require('webpack-merge');
const baseConfig = require('./webpack.base.config.js');

const ROOT_PATH = path.resolve(__dirname);
const SRC_PATH = path.resolve(ROOT_PATH, 'src');
const devConfig = merge(baseConfig, {
    devtool: 'eval-source-map',
    plugins: [
        new webpack.DefinePlugin({
            'process.env.NODE_ENV': '"development"'
        }),
        new HtmlwebpackPlugin({
            title: 'react-webpack-demo',
            filename: 'index.html',
            template: path.resolve(SRC_PATH, 'templates', 'index.html')
        })
    ]
});

module.exports = devConfig;

測試環境配置,webpack.test.config.js:segmentfault

const path = require('path');
const webpack = require('webpack');
const HtmlwebpackPlugin = require('html-webpack-plugin');
const merge = require('webpack-merge')
const baseConfig = require('./webpack.base.config.js');

const ROOT_PATH = path.resolve(__dirname);
const SRC_PATH = path.resolve(ROOT_PATH, 'src');
const testConfig = merge(baseConfig, {
    plugins: [
        new webpack.DefinePlugin({
            'process.env.NODE_ENV': '"test"'
        }),
        new webpack.optimize.UglifyJsPlugin({
            sourceMap: true,
        }),
        new HtmlwebpackPlugin({
            title: 'react-webpack-demo',
            filename: 'index.html',
            template: path.resolve(SRC_PATH, 'templates', 'index.html'),
            minify: {
                removeComments: true,
                collapseWhitespace: true,
                removeRedundantAttributes: true,
                removeScriptTypeAttributes: true,
                removeStyleLinkTypeAttributes: true,
                removeAttributeQuotes: true
            }
        })
    ]
});

module.exports = testConfig;

生成環境配置,webpack.prod.config.js:

const path = require('path');
const webpack = require('webpack');
const HtmlwebpackPlugin = require('html-webpack-plugin');
const merge = require('webpack-merge')
const baseConfig = require('./webpack.base.config.js')

const ROOT_PATH = path.resolve(__dirname);
const SRC_PATH = path.resolve(ROOT_PATH, 'src');
const prodConfig = merge(baseConfig, {
    plugins: [
        new webpack.DefinePlugin({
            'process.env.NODE_ENV': '"production"'
        }),
        new webpack.optimize.UglifyJsPlugin({
            sourceMap: true,
        }),
        new HtmlwebpackPlugin({
            title: 'react-webpack-demo',
            filename: 'index.html',
            template: path.resolve(SRC_PATH, 'templates', 'index.html'),
            minify: {
                removeComments: true,
                collapseWhitespace: true,
                removeRedundantAttributes: true,
                removeScriptTypeAttributes: true,
                removeStyleLinkTypeAttributes: true,
                removeAttributeQuotes: true
            }
        })
    ]
});

module.exports = prodConfig;

修改package.json:

"scripts": {
    "start": "webpack-dev-server --hot --progress --config webpack.dev.config.js",
    "build:dev": "rimraf dist && webpack --progress --config webpack.dev.config.js",
    "build:test": "rimraf dist && webpack --progress --config webpack.test.config.js",
    "build": "rimraf dist && webpack --progress --config webpack.prod.config.js"
},
# 啓動開發調試
npm run start
# 開發環境構建
npm run build:dev
# 測試環境構建
npm run build:test
# 生產環境構建
npm run build

項目中就能夠像下面這樣子調用後端接口

接口HOST定義,host.js:

if (process.env.NODE_ENV === 'development') {
  module.exports = `http://192.168.1.101:8000`
} else if (process.env.NODE_ENV === 'test') {
  module.exports = `http://192.168.1.102:8000`
} else {
  module.exports = `http://192.168.1.103:8000`
}

接口API定義,apis.js:

import host from './host'

function getApi (api) {
  return host + api
}

export default {
  login: getApi('/login'),
  logout: getApi('/logout'),
  ...
}

代碼:https://github.com/zhutx/reac...


React系列---Webpack環境搭建(一)手動搭建
React系列---Webpack環境搭建(二)不一樣環境不一樣配置
React系列---Webpack環境搭建(三)打包性能優化

相關文章
相關標籤/搜索