老调重弹 Webpack

前言

本来是准备只总结下热更新的,但发现webpack4升级后还是有不少改动,索性放在一起总结一下。
按照惯例,先上链接:https://github.com/LiuLingyang/framework。(注:该脚手架基于 webpack4 )

多入口多出口

在大家熟知的脚手架中,大部分可能都是单页面应用,即单入口单出口。当你的网站足够简单,SPA确实提高了用户体验。但对于企业级应用而言,SPA极易造成单个页面体积过大,它可能加载了很多其他页面的资源。SPA的另一个问题就是不利于SEO。针对这些问题,多页面 + 局部SPA 成为了最优的选择。

多页面大多数情况有多个html模板文件,并且要求引入各自的JS文件配置,即多入口多出口。如何生成多个页面?只要以链式的方法,调用html-webpack-plugin插件,每次调用都要指定filename也就是生成页面的名字。调用一次生成一个页面,调用两次生成两个页面,以此类推。

如何引入各自的JS文件配置?比如说我们希望index.html引入的是index.js,test.html引入的是test.js如何操作呢?
我们需要在html-webpack-plugin中再配置一个参数,chunks,支持数组,数组里面填写的是引入的js,也就是entry里面配置的key,要引入哪个js就配置entry中的哪个key。

Alt pic

开发环境?生产环境?

ebpack4中提供了更加快捷的mode模式来区分开发环境和生产环境。mode有两个值:development和production,默认值是 production。mode是我们为减小生产环境构建体积以及节约开发环境的构建时间提供的一种优化方案,提供对应的构建参数项的默认开启或关闭,降低配置成本。

Alt pic

Alt pic

development模式下,将侧重于功能调试和优化开发体验。
production模式下,将侧重于模块体积优化和线上部署。注意:这里不再需要配置UglifyJSPlugin插件,而是会自动启用uglifyjs对代码进行压缩。

webpack4其他改动

webpack4官方移除了commonchunk插件,改用了optimization属性进行更加灵活的配置,这也应该是从V3升级到V4的代码修改过程中最为复杂的一部分。

由于webpack4以后对css模块支持的逐步完善和commonchunk插件的移除,在处理css文件提取的计算方式上也做了些调整,之前我们首选使用的extract-text-webpack-plugin也完成了其历史使命,将让位于mini-css-extract-plugin。

剩下的问题大部分都是因为当前的包与webpack4不兼容。解决办法:升级呗。

这里就不贴出详细代码了,看源码吧。

模块热替换(Hot Module Replacement)

HMR是webpack最令人兴奋的特性之一,当你对代码进行修改并保存后,webpack将对代码重新打包,并将新的模块发送到浏览器端,浏览器通过新的模块替换老的模块,这样在不刷新浏览器的前提下就能够对应用进行更新。HMR是一个非常值得去深入研究的东西,它绝不是目前我们看到的大多数技术文章说的配置一个hot参数这么简单,有兴趣的小伙伴可以去看看它的实现原理,目前为止我也只看过一点点。

实现模块热替换的方式有两种,一种是采用中间件的方式,webpack-dev-middleware和webpack-hot-middleware配合使用,实现热替换功能;另外一种是使用webpack-dev-server插件,配置一些必要的参数,也可以实现热替换功能。需要注意的是两种方式都只用于开发环境。打包后的文件都是放到内存中的,所以我们在项目中是看不到它打包以后生成的文件的。本例采用第二种方式实现。

两种方式都需要配置的项我就放在最前面说好了:

  1. webpack的plugins添加webpack.HotModuleReplacementPlugin(),这是一个必要的热替换插件。你可能在某些地方可能会看到webpack-dev-server添加了hot: true以后,它会自动帮我们加这个插件。相信我,还是会报错的,所以还是老老实实的手动添加到plugins里面吧。

  2. 我们通过 HotModuleReplacementPlugin 启用了模块热替换,则它的接口将被暴露在module.hot属性下面。我们需要把整个项目的要被webpack编译的文件都设置为接受热更新,而最简单的方式就是在入口文件的地方添加:

    Alt pic

中间件

中间件的方式配置起来还是比较简单的。

Alt pic

就这几行核心代码,我就直接贴出来了。

中间件是可以和自己的后端服务整合的,相对与webpack-dev-server,它拥有更好的灵活性和自由度。

Koa实现热更新的中间件似乎还没有包可以直接引,但大神们早已为我们铺好了路。Kao架构可以参考:https://www.cnblogs.com/liuyt/p/7217024.html

webpack-dev-server

webpack-dev-server实际上相当于启用了一个express的Http服务器+调用webpack-dev-middleware。它的作用主要是用来伺服资源文件。这个Http服务器和client使用了websocket通讯协议,原始文件作出改动后,webpack-dev-server会用webpack实时的编译,再用webpack-dev-middleware将webpack编译后文件输出到内存中。

webpack-dev-server支持两种配置方式(iframe mode && inline mode)。

iframe模式不需要配置任何东西,只需要在你启动的项目的端口号后面加上/webpack-dev-server/即可,比如:http://localhost:8080/webpack-dev-server/
它的原理是在页面中嵌入了一个iframe标签来实现热更新。因为这种模式配置比较简单,这里就不展开介绍这种模式了。有兴趣的小伙伴可以自行研究。

inline模式不需要改变url,但配置起来比iframe模式繁琐的多。

inline模式又分两种方式启动,Node方式和非Node方式。

非Node方式

非Node方式有关webpack-dev-server的配置都在webpack.config.js的devServer参数里。一定要指定output.publicPath,如果不指定会导致HMR无法工作。

Alt pic

contentBase就和output.path是一样的作用,如果不配置这个参数就会打包到项目的根路径下。这里再强调一下为了加快打包进程打包后的文件是放到内存中的,所以我们是看不到实际文件的。

hot:true&&inline:true就是开启inline模式和热更新,没什么好说的。

proxy:当您有一个单独的后端开发服务器,并且想要在同一个域上发送API请求时,则代理这些url。设置代理后contentBase需要修改为绝对路径。本例中将被修改为http://localhost:3001/

命令行启动:webpack-dev-server --hot –inline。

Node方式

如果使用Node.js方式,那么即使你配置了devServer也会被忽略,真正起作用的应该是Node.js的dev.js文件,这个文件放在build目录下面。
此时启动项目:node build/dev.js。

build/dev.js

Alt pic

当然这还不够,还需要在entry属性里添加webpack-dev-server/client?http://«path»:«port»/ 和 webpack/hot/dev-server。

Alt pic

好的,选择一个你喜欢的方式启动起来吧,如果能在控制台看到以下的信息,代表热更新已经成功启动了。

Alt pic

react-hot-loader

你可以已经注意到了,在entry属性中我还添加了react-hot-loader/patch。

webpack-dev-server的热更新对于保存react状态是无法做到的,所以才有了react-hot-loader这个东西,这个不是必须配置的插件。
不过如果你想要更新时可以保存state,这是必须的。

配置分三步走:

1..babelrc中添加react-hot-loader/babel:

Alt pic

2.entry参数添加react-hot-loader/patch;

3.修改跟组件接收热更新:

Alt pic

经过一顿神操作后,相信你已经弄清楚了热更新到底是怎么回事。如果你的项目还没有开始应用,抓紧尝试下吧。

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

推荐阅读更多精彩内容

  • 写在前面的话 阅读本文之前,先看下面这个webpack的配置文件,如果每一项你都懂,那本文能带给你的收获也许就比较...
    不忘初心_9a16阅读 3,231评论 0 17
  • 构建一个小项目——FlyBird,学习webpack和react。(本文成文于2017/2/25) 从webpac...
    布蕾布蕾阅读 16,797评论 31 98
  • webpack 介绍 webpack 是什么 为什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert阅读 6,440评论 2 71
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 11,025评论 0 21
  • 雅香绕绕千里, 似唤行人语。 奈何行人不可与, 匆匆忙忙,来来去去。 浓茶且且空杯, 同催行人归, 遥望千里不知累...
    左遇先森阅读 386评论 0 1