react+webpack4.x搭建前端项目(四)配置抽取和区分环境

前言

前三章介绍了项目搭建和webpack打包优化。
1、react+webpack4搭建前端项目(一)基础项目搭建
2、react+webpack4搭建前端项目(二)react全家桶的使用
3、react+webpack4搭建前端项目(三)打包优化

这里小编推荐一个福利,更多精彩内容请点击链接,点击这里

接下来,我们接着上一篇文章react+webpack4搭建前端项目(三)打包优化进行webpack配置的提取和区分(开发,测试,生产)环境和编写脚本进行打包

简化项目代码

把src下的代码删除,新建index.js

import React from 'react'
import ReactDom from 'react-dom'
import "./app.less"

class App extends React.Component {
    render(){
        return (
            <div class="test">
                hello react-apps-template
            </div>
        )
    }
}

ReactDom.render(<App/>,document.getElementById("app"))

app.less

.test {
    color: purple;
    font-size: 20px;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

执行npm run devnpm run build测试正常

区分不同环境

webpack4.x之后,webpack内置了process.env.NODE_ENV这个环境变量而且只有两个值(development开发,production生产),但是我们项目一般都会有开发开环境,测试环境,预发布环境,生产环境等等。

所以这里我们需要在package.json添加打包测试环境的执行命令

"build-test": "cross-env NODE_ENV=test webpack --progress --config build/webpack.prod.config.js"

然后我们通过webpack之内的插件在webpack配置中添加另外一个全局环境变量(只要不和NODE_ENV重名就行)

我们在webpack.base.config.js中的plugins中添加如下代码

new Webpack.DefinePlugin({
    'process.env': {
        APP_ENV:JSON.stringify(process.env.NODE_ENV)
    },
}),

这样我么就为项目注入了全局变量APP_ENV,我们可以在app.js中打印APP_ENV的值测试一下

console.log(process.env.APP_ENV)

接着我们分别执行npm run devnpm run build-testnpm run build查看打印的值。
那么我们怎么看打包后的项目呢,我们之前介绍过http-server工具,在打包成功后

cd dist
http-server

根据提示打开浏览器,打开控制台查看就可以

webpack配置的提取

我们在utils.js中编写公用的cssLoaders方法来处理cssless

function cssLoaders(options){
    options = options || {};
    const cssLoader = { 
        loader: 'css-loader',  // 转换css
        options:{
            sourceMap: options.sourceMap
        }
    };

    function generateLoaders(loader,loaderOptions){
        const loaders = [cssLoader,'postcss-loader'];
        if(loader){
            loaders.push({
                loader: loader+"-loader",
                options:Object.assign({},loaderOptions , {
                    sourceMap: options.sourceMap
                })
            })
        }
        if(options.extract){
            return [
                {
                    loader:MiniCssExtractPlugin.loader,
                    options:{
                        hmr: process.env.NODE_ENV != 'development',  // 开发环境热更新 ,然而不起作用
                        reloadAll:true,
                    }
                }
            ].concat(loaders);
        }else{
           return ['style-loader'].concat(loaders)
        }
    }

    const object = {
        css: generateLoaders(),
        less: generateLoaders("less")
    }
    const output = [];
    for(let key in object){
        const loader = object[key];
        output.push({
            test:new RegExp('\\.' + key + '$'),
            use:loader
        })
    }
    return output;
}

然后我们把webapck.base.config.js处理cssless相关的loader删除,分别在webpack.dev.config.jswebpack.prod.config.js中添加处理cssloader

webpack.dev.config.js如下

module:{
    rules:utils.cssLoaders()
},

webpack.prod.config.js如下

module:{
    rules:utils.cssLoaders({extract:true,sourceMap:true})
},

测试环境不需要压缩css。生产环境需要对css文件进行压缩和输出sourceMap

接下来把webpack.base.config.js中的output修改成不再文件名后添加后缀配置

output: {
    path : utils.resolve("../dist"),
    filename: utils.assetsPath("js/[name].js") ,
    publicPath: "/" // 打包后的资源的访问路径前缀
},

webpack.prod.config.js中添加output

output: {
    path : utils.resolve("../dist"),
    filename: utils.assetsPath("js/[name].[hash].js") ,
    chunkFilename: utils.assetsPath("js/[name].[chunkhash].js"),
    publicPath: "/" // 打包后的资源的访问路径前缀
},

这样的话,开发环境js文件就不会带hash后缀喽

然后把webpack.base.config.js下的plugins中的

new MiniCssExtractPlugin({
    filename: utils.assetsPath('css/[name].[hash].css'),
    chunkFilename: utils.assetsPath('css/[id].[chunkhash].css'),
})

移到webpack.prod.config.js,这样开发环境css也不会带hash后缀喽

这里的文件开发环境就不需要去hash后缀名喽,如果需要的话,那也需要分区开发环境和打包环境

编写build.js打包

我们可以编写一个js脚本,然后用在node命令执行这个脚本,在这个脚本中进行webpack打包。
我们需要利用webpack提供的方法webpack(config,handler)
该方法的第一个参数是webpack的配置对象,第二个是webpack打包执行结果的回调

新建build/build.js文件
安装orachalk

npm install -D ora chalk

ora是用于在shell终端显示加载中的效果,类似于前端页面的loading效果
chalk是用于在shell终端输出带颜色颜色文本的插件

这两款插件的具体使用方法请看官网文档

编写build.js

const webpack = require("webpack")
const ora = require("ora");
const chalk = require("chalk")
const WebpackConfig = require("./webpack.prod.config")


// 启动动画
const spinner = ora("build....")
spinner.start()


// 开始构建
webpack(WebpackConfig,function(err,stats){
    // 停止动画
    spinner.stop()
    // 打包出错,抛出异常信息
    if (err) throw err
    // 控制台输出打包成功信息
    process.stdout.write(stats.toString({
      colors: true,
      modules: false,
      children: false,
      chunks: false,
      chunkModules: false
    }) + '\n\n')

    console.log(chalk.cyan('  Build complete.\n'))
    console.log(chalk.yellow(
      '  Tip: built files are meant to be served over an HTTP server.\n' +
      '  Opening index.html over file:// won\'t work.\n'
    ))
    process.exit(); // 终止终端进程
})

然后修改package.json的打包命令

"build-test": "cross-env NODE_ENV=test node build/build.js",
"build": "cross-env NODE_ENV=production node build/build.js"

分别执行测试,如下图:

QQ截图20191213125331.png

打包结果如下图

QQ截图20191213125345.png

源码请看release0.0.1版本源码0.0.1

下一篇:多页面配置 react+webpack4.x搭建前端项目之多页面配置

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354