moira-web
/
webpack.config.js
158 строк · 5.7 Кб
1const path = require("path");2const webpack = require("webpack");3const HtmlWebpackPlugin = require("html-webpack-plugin");4const ExtractTextPlugin = require("extract-text-webpack-plugin");5const UglifyJSPlugin = require("uglifyjs-webpack-plugin");6
7const config = argv => {8const PROD = process.env.NODE_ENV === "production";9const API_MODE = getApiMode(argv);10const config = {11entry: {12app: ["babel-polyfill", "react-hot-loader/patch", "./src/index.js"],13},14output: {15publicPath: "/",16path: path.resolve(__dirname, "dist"),17filename: PROD ? "app.[hash].js" : "app.js",18chunkFilename: PROD ? "app.[id].[hash].js" : "app.[id].js",19},20module: {21rules: [22{23test: /\.AppRoot\.js$/,24use: [25{26loader: "bundle-loader",27options: {28lazy: true,29},30},31"babel-loader",32],33include: path.join(__dirname, "src"),34},35{36test: /\.(js|jsx)?$/,37use: [38{39loader: "babel-loader",40options: {41presets: ["env", "stage-0", "react"],42},43},44],45include: /retail\-ui/,46},47{48test: /\.less$/,49use: PROD50? ExtractTextPlugin.extract({51fallback: "style-loader",52use: ["css-loader", "less-loader"],53})54: ["style-loader", "css-loader", "less-loader"],55include: /retail\-ui/,56},57{58test: /\.js$/,59use: ["babel-loader"],60exclude: /node_modules/,61},62{63test: /\.less$/,64rules: [65{ use: "classnames-loader" },66{67use: PROD68? ExtractTextPlugin.extract({69fallback: "style-loader",70use: [71{72loader: "css-loader",73options: {74modules: true,75localIdentName: "[name]-[local]-[hash:base64:5]",76},77},78"less-loader",79],80})81: [82"style-loader",83{84loader: "css-loader",85options: {86modules: true,87localIdentName: "[name]-[local]-[hash:base64:5]",88},89},90"less-loader",91],92},93],94exclude: /node_modules/,95},96{97test: /\.(png|woff|woff2|eot|svg)$/,98use: "file-loader",99},100],101},102resolve: {103modules: ["node_modules", "local_modules"],104},105plugins: [106new HtmlWebpackPlugin({107template: "./src/index.html",108favicon: "./src/favicon.ico",109inject: "body",110minify: {111collapseWhitespace: true,112},113}),114new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/),115new webpack.optimize.CommonsChunkPlugin({116name: "app",117children: true,118}),119],120devServer: {121host: "0.0.0.0",122disableHostCheck: true,123proxy:124API_MODE === "fake"125? {126"/api": {127target: "http://localhost:9002",128pathRewrite: { "^/api": "" },129},130}131: {132"/api": {133target: "http://localhost:8081",134secure: false,135changeOrigin: true,136},137},138},139//devtool: "source-map"140};141if (PROD) {142config.plugins.push(new webpack.optimize.ModuleConcatenationPlugin());143config.plugins.push(new ExtractTextPlugin("app.[hash].css"));144config.plugins.push(new UglifyJSPlugin({ extractComments: { banner: false } }));145}146return config;147};148
149function getApiMode(argv) {150for (const arg of argv) {151if (arg.startsWith("--env.API=")) {152return arg.substr("--env.API=".length);153}154}155return "real";156}
157
158module.exports = config(process.argv);159