【webpack4x】实战配置及问题解析

目录

一、Library打包
二、Progressive Web Application(PWA)打包配置
三、TypeScript的打包配置
四、WebpackDevServer实现请求转发
五、WebpackDevServer解决单页面应用路由问题
六、EsLint在webpack中的配置
七、提升webpack打包速度的方法
八、多页面打包配置

 

一、 library打包

场景1:

现在我们写了一个库

1

1616136-20190805203630969-680010841.png

2. 外部引入我们的库可能存在的语法

1616136-20190805203642441-832982660.png

3. 需要我们的库可以支持

1616136-20190805203653501-641160942.png

配置libraryTarget: ’umd‘支持上述的前三种方法,对于最后一种使用办法,可以通过library: 'library'绑定到一个全局变量library上

4. 其他

1616136-20190805203706103-1677858522.png

这里可以绑定到window或者this或者global上等

场景2:

有时候需要在自己的库中引入别人的库,做了一些处理。然后某个用户使用了我们的库,又使用了我们的库中使用的库,那么就会重复引入两次一个库。

解决办法:

1616136-20190805203738539-1872111540.png

commonjs:'lodash'表示在commonjs语法中,引入名字必须是lodash
root:'_'表示,使用script标签引入的时候,可以使用_使用
通常情况下,如果没有特殊说明,可以直接这么设置:
1616136-20190805203753664-639037607.png

小结:

externals表示的是,不打包到库里面,只有在用户使用的时候,才引入和打包

场景3: 别人怎么使用

1. 删除掉index.html
2.

1616136-20190805203821201-831145887.png

3. 到npm网站上注册一个账号

然后到cmd上 npm adduser
然后npm publish
把包发布到上面就可以了。

 

二、Progressive Web Application(PWA)打包配置

1. PWA是什么技术?

当我们访问一个网站,第一次访问没有问题,后续挂掉了,能从缓存中读取出来这个网页。

2. 安装插件

1616136-20190805203934134-269398250.png

3.

1616136-20190805203956294-1174773826.png

4.

1616136-20190805204005379-793832730.png

5. 在项目中应用

1616136-20190805204016549-674850796.png

6.打包完以后

1616136-20190805204025371-1849296697.png

 

三、TypeScript的打包配置

场景: ts项目编译成浏览器可以运行的js

1.

1616136-20190805204052213-35446232.png

2.新建tsconfig.json

1616136-20190805204104221-786089317.png

3. 配置webpack

1616136-20190805204117534-887871250.png

4. 打包命令

1616136-20190805204130564-374239205.png

5. 遇到问题: 使用lodash中的一些函数,ts不报错

1616136-20190805204144085-19137978.png

以上是新版本ts推荐的方式

 

四、WebpackDevServer实现请求转发

场景1: 在实际项目中,我们请求数据的地址不会完全写死

1616136-20190805204205173-1686554715.png

需要配置下转发请求的地址:
1616136-20190805204216780-2137561871.png

当我们请求/react/api下接口的时候,都帮我代理到http://xxxxxx下

场景2: 实际需要请求header.json数据,但是后端还没有写好,需要先请求下demo.json

解决办法

1616136-20190805204234592-459207670.png

(要注意的是,这个devServer只在开发的时候有,线上的时候不存在)

场景3: 请求转发,转发到https’

1616136-20190805204247741-259826598.png

场景4 多个路径,吧路径放在context中管理

1616136-20190805204303277-300918357.png

场景5 对根目录进行转发

1616136-20190805204320227-653365389.png

必须得设置inde: ''或者false才会生效

场景6 有些网站对origin进行了限制,防止外部爬虫,解决限制(建议做代理转发的时候,时刻加上这个)

1616136-20190805204337234-847326155.png

场景7 还可以做大量配置(具体查看文档),例如做请求转发的时候,headers里面进行配置

1616136-20190805204347126-93886674.png

其他1.

1616136-20190805204403344-1130332430.png

以/api开头的都去掉

其他2.

1616136-20190805204416258-1460301663.png

当识别到请求的是一个html文件的时候,直接跳过本次请求

 

五、WebpackDevServer解决单页面应用路由问题

问题分析:

1616136-20190805204436489-1087362376.png
1616136-20190805204445462-1680822888.png

使用react路由去访问/list的时候,devServer以为你访问的是一个/list.html页面,结果服务器没有这个页面,导致了错误,

解决办法:

1616136-20190805204504343-21340184.png

特别需要处理的地址的时候,可以这么配置
1616136-20190805204515278-1934066324.png

跳转到哪儿,还可以这样配置
1616136-20190805204528423-1396971838.png

其他需要注意:
项目上线后,可能会遇到类似的问题,需要后端的小伙伴配置上述类似的跳转规则

 

六、EsLint在webpack中的配置

场景1:传统vsCode+插件eslint对代码格式约束

1.

1616136-20190805204604175-1695625132.png

2.

1616136-20190805204614876-2037107709.png

3. 结合vsCode插件eslint

上述表示,使用Airbnb的eslint规范,同时也忽略无状态class和jsx的提示

场景2:

webpack配置使得eslint生效(通常不会这么处理,因为会影响打包的速度)
1616136-20190805204637991-1387371788.png

上述配置了eslint-loader,并且自动处理一些简单的代码,注意放在最先处理,如果放错可以强制处理
1616136-20190805204651501-1728595013.png
1616136-20190805204702254-1294779388.png

打包出问题的时候,直接在浏览器上弹出一层错误提示

 

七、提升webpack打包速度的方法

1. 跟上技术的迭代(Node,Npm,Yarn)

2. 在尽可能少的模块上应用loader

例如:
1616136-20190805204724658-11477906.png

3. 尽可能使用一些社区中较好的插件

优化1: 每次打包的时候,比如第三方模块,第一次打包后后续打包直接使用上一次的代码分析,提高打包速度(也就是说第三方包只打包一次)

1616136-20190805204745126-1516328777.png

上述操作主要:将react等这三个库,打包到vendors.dll.js中,并且暴露一个全局变量名vendors

问题1:

单独对第三方包打包,但是现在全局使用不了vendors

解决:

1616136-20190805204825362-192955010.png

然后在配置文件中:
1616136-20190805204835006-1211443080.png

往index.html中添加
再次打包打开,引入成功
1616136-20190805204844061-2127034683.png

问题2: 我们引入第三方模块的时候,要去使用打包后的第三方包

1616136-20190805204906391-1504884251.png

和配置
1616136-20190805204916647-655747344.png

使得webpack打包的时候,会根据我们打包出来的第三方包和打包分析出来的vendors.manifest.json这个文件,当打包遇到使用了这个映射文件中的第三方包的时候,就会知道,没有必要吧这个第三方模块打包了,直接去底层全局变量拿出来使用。

问题3: 可能会对第三方模块进行拆分,分成好几个*.dll.js
1616136-20190805205009517-854096455.png

然后需要不断的配置
1616136-20190805205018813-824963018.png

解决办法:
1616136-20190805205027652-1598325591.png

优化2:控制包文件大小

对于源代码不适用的包,可以通过tree shaking阉割,或者不引入使用

优化3: thread-loader,parallel-webpack,happypack多进程打包

优化4:合理使用sourceMap,

优化5:结合stats分析打包结果

优化6: 开发环境内存编译

优化7: 开发环境无用插件剔除(例如,开发环境就用development不用production,不要像线上环境去使用一些插件)

需要未来在实战中不断积累经验

其他1:

支持js和jsx(但是在组件中引入的时候要加上jsx,否则报错)
1616136-20190805205101732-1642727632.png

其他2:

上述优化
1616136-20190805205118246-630240378.png

使得支持(后缀为js或jsx)
1616136-20190805205129424-516296926.png

其他3:

引入一个文件夹名称的时候,首先默认找到文件夹下的index.js(会影响打包速度)
1616136-20190805205142861-590087588.png

其他4:

引入一个不存在文件(或者别名),会报错,解决办法
1616136-20190805205158039-642385025.png

 

八、多页面打包配置

1.入口配置

1616136-20190805205213128-1152279630.png

2.输出模板配置

1616136-20190805205228472-1299141708.png

继续优化,每个页面需要引入的包,使用chunks属性
1616136-20190805205237600-668972379.png

继续优化,每次添加一个就需要复制一个类似的代码,使用一个方法根据多少个入口进行生成(包括对优化1中的代码提取结合进来)
1616136-20190805205249584-189666155.png

1616136-20190805205305785-669693973.png

1616136-20190805205320848-1098374296.png

转载于:https://www.cnblogs.com/fe-linjin/p/11305491.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值