webpack3构建生产和开发环境分离

15 篇文章 0 订阅
7 篇文章 0 订阅

官网链接:https://webpack.js.org/guides/production/

 webpack开发环境和生产环境的构建目标差异很大。在开发环境中,需要具有强大的、具有实时加载或者热模块替换的source map和localhost server。而生产环境中,关注的是更小的bundle,更轻量的source map,以及更加优化的资源,已改善加载文件的时间。要遵循逻辑分离,我们通常建议为每个环境编写独立的webpack配置。

 虽然,我们将生产环境(prod)和开发环境(dev)做了区分,但是还是要注意不要做重复的原则,保留通用配置。为了将这些配置合并在一起,需要使用webpack-merge插件,通过“通用”配置,我们不必在环境特定的配置中写重复代码。

 因为我的项目是react,所以以react项目为例

1.安装webpack-merge插件 
 npm install --save-dev webpack-merge

---

2.项目结构和代码

 

  • webpack.base.config.js(公共模块)
//__dirname是node.js中的一个全局变量,它指向当前执行脚本所在的目录
const webpack = require('webpack');
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const HtmlWebpackPlugin = require('html-webpack-plugin');
const autoprefixer = require('autoprefixer');
const path=require('path');

var ROOT_PATH = path.resolve(__dirname);
var SRC_PATH = path.resolve(__dirname, 'src');
var LIB_PATH =path.resolve(__dirname, 'node_modules');
console.log(SRC_PATH);
console.log(LIB_PATH);

module.exports = {//注意这里是exports不是export
    entry: {
        app:SRC_PATH + "/main.js",//唯一入口文件,就像Java中的main方法
        lib: ["react"],
    },
    output: {//输出目录
        path: ROOT_PATH + "/build",//打包后的js文件存放的地方
        filename: "js/bundle.js",//打包后的js文件名
        chunkFilename: 'js/[name].[id].js',//bundle-loader分开打包的js名字
    },
    module: {
        //loaders加载器
        rules: [
            {
                test: /\.bundle\.js$/,
                loader: 'bundle-loader',
                include:/page/,
                options: {
                    lazy: true,
                    name: '[name]'
                }
            },{
                test: /\.(js|jsx)$/,//一个匹配loaders所处理的文件的拓展名的正则表达式,这里用来匹配js和jsx文件(必须)
                exclude: LIB_PATH,//屏蔽不需要处理的文件(文件夹)(可选)
                use: 'babel-loader'//loader的名称(必须)
            },{ 
                test: /\.(css|less)$/, 
                use:ExtractTextPlugin.extract({
                        fallback: "style-loader",
                        use: [{
                            loader: "css-loader",
                            options: {
                                modules: true, // 指定启用css modules
                                localIdentName: '[name]__[local]--[hash:base64:5]' // 指定css的类名格式
                            }

                        },{
                            loader: "postcss-loader",
                            options: {
                                plugins: () => [autoprefixer(
                                  { browsers: ['iOS >= 7', 'Android >= 4.1', 
                                     'last 10 Chrome versions', 'last 10 Firefox versions', 
                                     'Safari >= 6', 'ie > 8'] 
                                  }
                                )],
                            },
                        },{
                            loader: "less-loader"
                        }]
                })
            },{
                test: /\.(eot|svg|ttf|woff|woff2)\w*/,// font awesome loader
                use: [
                  {
                    loader: 'file-loader',
                    options: {
                        outputPath:'css/'
                    }
                  }
                ]               
            }

        ]
    },
    plugins: [
        new ExtractTextPlugin('css/[name].css'),
        new HtmlWebpackPlugin({
            template: __dirname + "/src/index.tmpl.html"//new 一个这个插件的实例,并传入相关的参数
        }),
        new webpack.optimize.CommonsChunkPlugin({
            name: 'lib', 
            filename:'js/common.js',
            minChunks: function (module) {
                // This prevents stylesheet resources with the .css or .scss extension
                // from being moved from their original chunk to the vendor chunk
                if(module.resource && (/^.*\.(css|scss)$/).test(module.resource)) {
                    return false;
                }
                return module.context && module.context.includes("node_modules");
            }
        })
    ]
};
  • webpack.dev.config.js 开发模块
 const merge = require('webpack-merge');
 const base = require('./webpack.base.config.js');

 module.exports = merge(base, {
     devtool: 'source-map',
     devServer: {
         contentBase: "./build", //本地服务器所加载的页面所在的目录
         historyApiFallback: true, //不跳转
         port: 8888, //设置默认监听端口,如果省略,默认为”8080“
         inline: true //实时刷新
     },
 });
  •  webpack.base.config.js 生产环境
const merge = require('webpack-merge');
const webpack = require('webpack');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
const base = require('./webpack.base.config.js');
module.exports = merge(base, {
    devtool: 'source-map',//为了能显示,因为懒没弄node server 正常可以省略
    plugins: [
        new UglifyJSPlugin(),
        new webpack.DefinePlugin({
            'process.env.NODE_ENV': JSON.stringify('production')
        }),
        new webpack.LoaderOptionsPlugin({ //去除调试代码,压缩代码
            minimize: true
        }),
        // new webpack.optimize.UglifyJsPlugin({
        //     output: {
        //         comments: false// remove all comments
        //     },
        //     compress: {
        //         warnings: false
        //     },
        //     sourceMap: true // 如果你在压缩代码时启用了 source map,或者想要让 uglifyjs 的警告能够对应到正确的代码行,你需要将 UglifyJsPlugin 的 sourceMap 设为 true。
        // }),
        // new webpack.NoEmitOnErrorsPlugin(),//复制手动引入的资源文件到指定目录
    ]
});
3.package.json添加生成生产环境资源命令和开发环境启动服务命令
"start": "webpack --config webpack.prod.config.js",
"dev":"webpack-dev-server --open --config webpack.dev.config.js",
"server": "webpack-dev-server --open --config webpack.prod.config.js"
最后一条只是我懒= =,直接启动webpack-dev-server。
然后我们来启动看看。

1.npm run dev 

 可以看到下图,react developer tools 是红色的,开发模式ok


2.npm run server

 可以看到下图,react developer tools 是蓝色的,生产模式ok



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值