Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >React多页面应用7(webpack4 生产环境配置)

React多页面应用7(webpack4 生产环境配置)

作者头像
前端人人
发布于 2018-04-17 05:50:33
发布于 2018-04-17 05:50:33
1.2K00
代码可运行
举报
文章被收录于专栏:前端人人前端人人
运行总次数:0
代码可运行
本教程总共9篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章!

1、React多页面应用1(webpack4 开发环境搭建,包括热更新,api转发等)---2018.04.04

2、React多页面应用2(webpack4 处理CSS及图片,引入postCSS,及图片处理等)---2018.04.08

3、React多页面应用3(webpack4 多页面实现)---2018.04.09

4、React多页面应用4(webpack4 提取第三方包及公共组件)---2018.04.10

5、React多页面应用5(webpack4 多页面自动化生成多入口文件)---2018.04.11

6、React多页面应用6(webpack4 开发环境打包性能小提升)---2018.04.12

7、React多页面应用7(webpack4 生产环境配置)---2018.04.13

8、React多页面应用8(webpack4 gulp自动化发布到多个环境,生成版本号,打包成zip等)---2018.04.16

9、React多页面应用9(webpack4 引入eslint代码检查)---2018.04.17

开发环境:Windows 8,node v8.9.1,npm 5.5.1,WebStorm 2017.2.2

我们之前课程讲的都是开发环境的配置,今天我们来讲下,辛辛苦苦写的代码,如何优雅的打包成生产环境代码?

生产环境代码需要有几个特点:

  1. 文件体积尽量的小
  2. 浏览器缓存!如果修改,如何让浏览器重新拉取
  3. 请求数尽量少

我们带着这几个目的,来配置我们的webpack生产环境!

1、首先我们安装必要的依赖

npm i -D html-webpack-plugin@3.1.0 optimize-css-assets-webpack-plugin@4.0.0 extract-text-webpack-plugin@4.0.0-beta.0 file@0.2.2 clean-webpack-plugin@0.1.19 copy-webpack-plugin@4.5.1

2、新建 webpack.prod.conf.js

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const path = require('path');
const merge = require('webpack-merge');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin');
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const baseWebpackConfig = require("./webpack.base.conf");
const webpackFile = require('./webpack.file.conf');
const entry = require("./webpack.entry.conf");
const webpackCom = require("./webpack.com.conf");

let config = merge(baseWebpackConfig, {
    /*设置生产环境*/
    mode: 'production',
    output: {
        path: path.resolve(webpackFile.proDirectory),
        filename: 'js/[name].[chunkhash:8].js',
        chunkFilename: "js/[name]-[id].[chunkhash:8].js",
    },
    optimization: {
        //包清单
        runtimeChunk: {
            name: "manifest"
        },
        //拆分公共包
        splitChunks: {
            cacheGroups: {
                //项目公共组件
                common: {
                    chunks: "initial",
                    name: "common",
                    minChunks: 2,
                    maxInitialRequests: 5,
                    minSize: 0
                },
                //第三方组件
                vendor: {
                    test: /node_modules/,
                    chunks: "initial",
                    name: "vendor",
                    priority: 10,
                    enforce: true
                }
            }
        }
    },
    plugins: [
        // extract css into its own file
        new ExtractTextPlugin('css/[name].[md5:contenthash:hex:8].css'),
        // Compress extracted CSS. We are using this plugin so that possible
        // duplicated CSS from different components can be deduped.
        new OptimizeCSSPlugin({
            assetNameRegExp: /\.css$/g,
            cssProcessor: require('cssnano'),
            cssProcessorOptions: {
                discardComments: {removeAll: true},
                // 避免 cssnano 重新计算 z-index
                safe: true
            },
            canPrint: true
        }),
    ],
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                use: [
                    'babel-loader',
                ],
            },
            {
                test: /\.(js|jsx)$/,
                loader: 'babel-loader',
                exclude: /node_modules/,
            },
            {
                test: /\.(css|pcss)$/,
                use: ExtractTextPlugin.extract({
                    fallback: "style-loader",
                    use: "css-loader!postcss-loader"
                })
            },
            {
                test: /\.(png|jpg|gif|ttf|eot|woff|woff2|svg)$/,
                loader: 'url-loader?limit=8192&name=[name].[hash:8].[ext]&publicPath=' + webpackFile.resourcePrefix + '&outputPath=' + webpackFile.resource + '/'
            },
            {
                test: /\.swf$/,
                loader: 'file?name=js/[name].[ext]'
            }
        ]
    }
});
let pages = entry;
for (let chunkName in pages) {
    let conf = {
        filename: chunkName + '.html',
        template: 'index.html',
        inject: true,
        title: webpackCom.titleFun(chunkName,pages[chunkName][1]),
        minify: {
            removeComments: true,
            collapseWhitespace: true,
            removeAttributeQuotes: true
        },
        chunks: ['manifest', 'vendor', 'common', chunkName],
        hash: false,
        chunksSortMode: 'dependency'
    };
    config.plugins.push(new HtmlWebpackPlugin(conf));
}
/* 清除 dist */
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
config.plugins.push(new CleanWebpackPlugin([webpackFile.proDirectory], {root: path.resolve(__dirname, '../../'), verbose: true, dry: false}));
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let copyObj = [
/*    {from: './app/public/plugin', to: './plugin'},//一些不需要走webpack的插件
    {from: './app/public/versionTips', to: './versionTips'},//固定不变的浏览器版本提示文件
    {from: './app/public/file', to: './resource'},//一些固定的文件,如下载文件*/
    {from: './app/public/img/favicon.ico', to: './'},//网站favicon.ico
];

let copyArr = [];
copyObj.map((data) => {
    copyArr.push(
        new CopyWebpackPlugin([{from: data.from, to: data.to, ignore: ['.*']}])
    )
});

/* 拷贝静态资源  */
copyArr.map(function (data) {
    return config.plugins.push(data)
});


module.exports = config;

修改下 webpack.file.conf.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
    devDirectory: 'devBuild', /*开发目录*/
    proDirectory: 'dist', /*发布目录*/
    resource: 'resource', /*静态资源*/
    resourcePrefix: 'resource', /*静态资源前缀*/
};

其他的 跟webpack3 有一些区别

其中

图片大小超过8192,会被base64转码,减少了一次请求.

3、修改package.json

"p": "SET BABEL_ENV=production && webpack --progress --colors --config config/webpack/webpack.prod.conf.js",

4、执行命令

npm run p

文件都自动加上了 hash值,便于浏览器缓存,修改后这个hash会变,浏览器会重新获取.

我们打开文件夹

分别用浏览器打开这几个html文件

图片没有显示?不要慌,这是路径问题,上传到服务器,就应该好了,根据你的路径去自定义!

在这个地方修改

下面我们会讲解,如何自动化发布到服务器上!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端人人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【每日一题】问题 1073: 弟弟的作业
题目描述 你的弟弟刚做完了“100以内数的加减法”这部分的作业,请你帮他检查一下。每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过100的非负整数;c是
编程范 源代码公司
2018/08/16
5980
[每日一题]山?水!
今天的题解让我们从一个一位老禅师和话引出: 青源惟信禅师讲到自己修佛悟道的历程时说:“老僧三十年前来参禅时,见山是山,见水是水;及至后来亲见知识,有个入处,见山不是山,见水不是水;而今得个体歇处,依然见山还是山,见水还是水。” 或许你现在还看不出这段话和我们今天的题有什么联系,又或许你已经看出了其中的端瑞,那么就让我们赶紧步入正题,来看看我们今天的题目(1073:弟弟的作业) 题目描述 你的弟弟刚做完了“100以内数的加减法”这部分的作业,请你帮他检查一下。每道题目(包括弟弟的答案)的格式为a+b=c或
编程范 源代码公司
2018/04/18
6290
[每日一题]山?水!
[每日一题]弟弟的作业就是经典
昨天黑客大佬开车,今天是时候展示咱自己的老司机卡了 题目描述 你的弟弟刚做完了“100以内数的加减法”这部分的作业,请你帮他检查一下。每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a
编程范 源代码公司
2018/04/18
6800
算法修炼之练气篇——练气五层
如果N > 0, 输出positive; 如果N = 0, 输出zero; 如果N < 0, 输出negative。
命运之光
2024/03/20
1710
算法修炼之练气篇——练气五层
ACM之7.21日作业题解
题解:这里的A是用来存放各位数的一个数组因为最多只有10个不同的数字所以A[10]恰好 够用,result[300]是用来打标记的,用过的数组就改false为ture,当然你也可以用一个 变量来统计数字出现的次数,出现2次就输出“NO”,然后return 0。
Tanger
2021/06/16
9080
Contest100000575 – 《算法笔记》3.1小节——入门模拟->简单模拟
http://codeup.cn/contest.php?cid=100000575 Problem A: 剩下的树 Time Limit: 1.000 Sec Memory Limit: 32 M
可定
2020/04/20
1.1K0
汽水瓶(OI赛题)
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
pigeon
2022/04/11
3340
Contest100000579 – 《算法笔记》3.5小节——入门模拟->进制转换
http://codeup.cn/contest.php?cid=100000579 Problem A: 又一版 A+B Time Limit: 1.000 Sec Memory Limit: 3
可定
2020/04/20
7430
C语言沉浸式刷题【C语言必刷题】
某地发生了一起谋杀案,警察通过排查确定杀人凶手必为四个嫌疑犯的一个,以下是4个嫌犯的供词。已知(请编写代码找出凶手)
see.
2024/06/04
2580
C语言沉浸式刷题【C语言必刷题】
C语言编程入门训练(二)
备注: 通过scanf函数的%m格式控制可以指定输入域宽,输入数据域宽(列数),按此宽度截取所需数据;通过printf函数的%0格式控制符,输出数值时指定左面不使用的空位置自动填0。
RAIN7
2021/08/11
1.4K0
100例C语言经典编程题 | 浙大版C语言题目集第三版,助力你C语言从入门到精通
本题要求编写程序,输出一个短句“Programming in C is fun!”。
C you again 的博客
2021/09/14
4.9K1
100例C语言经典编程题 | 浙大版C语言题目集第三版,助力你C语言从入门到精通
2017年浙江理工大学程序设计竞赛校赛 题解&源码(A.水, D. 简单贪心 ,E.数论,I 暴力)
Problem A: 回文 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1719  Solved: 528 Description 小王想知道一个字符串是否为ABA’型字符串。ABA’型字符串的定义:S=ABA’,A,B,A’都是原字符串的子串(不能是空串),A’的意思是A的反转串,B不一定要和A或A’不同。符合ABA’型的例如:"aba”,"acbbca”,"abcefgcba”等。"Abcefgcba”是ABA’型,因为它能找到一组对应的A("abc”
Angel_Kitty
2018/04/08
1.5K0
2017年浙江理工大学程序设计竞赛校赛 题解&源码(A.水, D. 简单贪心 ,E.数论,I 暴力)
【C语言】题集 of ①
🚀write in front🚀    🔎大家好,我是泽En,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🏅2021年度博客之星物联网与嵌入式开发TOP5→周榜34→总榜2815🏅 🆔本文由 泽En 原创 CSDN首发🐒 如需转载还请通知⚠ 📝个人主页:打打酱油desu_泽En_CSDN博客🎓 📣系列专栏:【C】系列_打打酱油desu-CSDN博客📢 ✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩  目录 🚀write in front🚀    🍪第一题→给两个正
謓泽
2022/12/12
9250
计蒜客2018 蓝桥杯省赛 B 组模拟赛(一)
1,结果填空:年龄 今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”。 花椰妹看大家一脸懵逼,就知道大家也不知道蒜头君的年龄,便连忙补充道:“我的年龄是蒜头君个位数和十位数之和的三倍”。 请你计算:蒜头君和花椰妹年龄一共有多少种可能情况? 提醒:两位的年龄都是在 [10,100)[10,100) 这个区间内。 分析: 暴力枚举每一个人可能的年龄,然后判断是否符合条件。 #include<stdio.
Zoctopus
2018/06/04
1.1K0
第2章:循环结构程序设计
分支和循环结合在一起时功能强大:下面枚举所有可能的aabb,然后判断它们是否为完 全平方数。注意,a的范围是1~9,但b可以是0。主程序如下:
twelvecoder
2021/12/21
1.6K0
简单模拟
为了用事实说明挖据机技术到底哪家强,PAT组织了一场挖据机技能大赛。请根据比赛结果统计出技术最强的那个学校。
可定
2020/04/20
8080
简单模拟
【蓝桥杯系列】第一节 C的基本用法
置顶编程范收获更多热门编程快讯 大家好,最近很多小伙伴向我反应小编!我参加了蓝桥杯但是我连那是什么都不知道,我该怎么训练?是不是在网站刷题就可以啊? 在这里我要回答的是刷题是必须的,著名土神(tourist)刷题超过10000道 每道估计40分钟,大约要7000个小时。可是说是地标最强【俄罗斯真是恐怖 当然我们做题是要有章法的,今天我们先统一学一遍C的基本用法 课前准备 Dev-cpp C语言网 推荐课外学习教材:《算法竞赛入门经典(第2版)》 刘汝佳 编著 清华大学出版社 C语言 编程规范 缩进 代码
编程范 源代码公司
2018/04/18
1.2K0
【蓝桥杯系列】第一节 C的基本用法
浙大版《C语言程序设计(第3版)》题目集 91~100
本题要求实现一个计算非负整数阶乘的简单函数,并利用该函数求 1!+2!+3!+...+n! 的值。
C you again
2022/08/22
1.4K0
浙大版《C语言程序设计(第3版)》题目集 91~100
Contest100000574 – 《算法笔记》2.10小节——C/C++快速入门->黑盒测试
http://codeup.cn/contest.php?cid=100000574 Problem A: A+B 输入输出练习I Time Limit: 1 Sec Memory Limit: 3
可定
2020/04/20
5440
蓝桥杯题库基础练习:进制转换
一、十六进制转十进制 问题描述   从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。   注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF 样例输出 65535 分析:按16进制展开;按数位依次操作,每次将前面的乘16,再加上当前数位的值。 C语言代码 #include<stdio.h> #include<string.h> #include<math.h> int main(){ char strHex
Zoctopus
2018/06/04
1.1K0
相关推荐
【每日一题】问题 1073: 弟弟的作业
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验