上一篇说了webpack5打包其他资源已经可以不用到file-loader与url-loader了。
webpack5可以使用 资源模块类型(asset module type),替代file-loader等。
这样说较为抽象,看具体实现。为了验证我们这个资源模块类型可用
可以看到里面有两个点,assetModuleFilename的ext跟我们之前设置的ext不一样,默认是会拿到后缀并且包括那个点,所以这里我们可以不加点。
asset类型又多一个属性,parser,表示解析,是个对象,里面有个固定的属性,叫dataUrlCondition,顾名思义,data转成url的条件,也就是转成bas64的条件,maxSize是就相当于Limit了,当大于100kb才不转换,所以
打包完没转换。
当大于10kb转换时,已经转换了而且生成的位置名字符合generator。
特殊的字体,字体图标。下载了阿里的一个图标
把它放到关系依赖图
build后报错
缺少loader。css为什么缺少loader
在webpack5之前是直接通过url-loader,file-loader来处理,webpack5后就不用了。
一般的操作都是将字体文件复制到build下面。
打包成功,注意test后面跟着的是正则,不能加“”。
MP3 MP4文件也是一样这样处理即可
每次打包都要手动删除build,不然会冲突。其次,最主要的原因是打包后的文件一定要有Index.html。
之前每次打包的build都没有index.html。
plugin就可以帮我们生成。
什么是plugin呢,loader是用于特定的模块进行转换,而plugin可以用于更加广泛的任务,比如打包优化,资源管理,环境变量注入等等。
看一幅图,css-loader可以加载css文件,csso-loader优化,而要打包成style.css就得通过Plugin。
自动删除build,新打包的文件覆盖旧的文件。
cnpm install clean-webpack-plugin -D
使用也是非常简单
先看下cleanWebpackPlugin源码
是一个类,并且导出了。
在plugin属性里面,直接生成一个实例,源码里cleanWebpacjPlugin是一个类,所以我们使用的时候是new一个实例就行。以后自定义plugin都是类的形式。
打包下看看
打包成功并且帮我们删除了原来的build文件了。
顾名思义就是对html文件的处理,因为我们之前打包,html是没有打包到build的。
生成html有两种方式,一种是使用默认的,他自己的ejs模板,一种是我们给他一个ejs模板
试试这插件的威力,直接把Index.html除掉
cnpm install html-webpack-plugin -D
因为html-webpack-plugin是通过module.exports来到出的,使用也是很简单,直接new就完事了,看看打包
打包成功,压缩是因为Mode为上苍模式,后续再讲。这样html就生成了。
ejs模板学过Node的应该熟悉,里面的《%= %>是准备给值替代的。
可以看到里面是个options.title,我们可以传值进去。
已经被替换了。
像vue的写法就是,学过vue的一般都知道,有个Public文件,里面有Index.html,那就是vue的模板。
使用也很简单,只要在
设置template属性即可。build一下试试
可以看到已经打包成功了。
但这个我们如果要使用全局变量时,但是现在我们没有BASE_URL,那么打包就会报错。
所以我们要配置全局变量。
使用也非常简单
打包一下
报错了
因为我们这个是外面包裹一层字符串的,因为如果
baseUrl: ‘/’ => 内部编译 const baseUrl = ./
这样就会报错,所以我们得再添加一层字符串包裹。打包一下
很明显看到,BASE_URL已经被替换了。
cnpm install copy-webpack-plugin -D
老规矩,先导入,再去new
可以看到我们new的时候可以传参数过去,第一个就是patterns,匹配的意思,里面的from表示会复制的文件夹。而to可以忽略,默认会使用output的path的,最后就是我们要忽略的文件了,比如Index.html是要生成的,不是我们传的,所以使用globOptions里面的ignore属性,而且忽略要注意用法,加**/才表示是在public里面忽略。看看效果
可以看到Css文件被忽略了,index.html不是复制过来的,是生成的。
这样看上去有点别扭,因为我们生成的js文件,或者复制过去的css文件,icon文件想放在相对应的文件夹,如js文件夹, css文件夹等等。
我们来设置budle.js放到Js文件里去,
output配置就行了。
看到生效了。