美文网首页
webpack学习总结

webpack学习总结

作者: Lxs_597 | 来源:发表于2017-08-15 11:19 被阅读0次

Webpack学习总结

此文只是自己学习webpack的一些总结,方便自己查阅,阅读不变,非常抱歉!!

下载安装:

Win10

打开命令行工具创建文件夹:mkdir webpack-test(文件名不能叫webpack,不然会报错无法下载webpack)

进入文件夹:cd webpack-test

初始化init:npm init;(生成一个package.json文件)

下载安装webpack:npm install webpack --save-dev;(依赖注入)

尝试使用:

在webpack-test目录下新建一个hello.js文件,随便输入一些代码,如:

在命令行中输入webpack hello.js hello.boudle.js:

看到如上结果说明已经打包成功,文件目录下会生成一个hello.boudle.js文件:

Hash:Hash值;

Version:webpack版本号;

Time:打包所花费的时间;

Asset:生成的文件;

Size:文件大小;

Chunks:打包的分块;

Chunk Names:打包的块名称;

下一步,新建一个world.js文件,然后在hello.js中对其引用,webpack支持ES6、Commonjs、AMD模块语法:

输入webpack hello.js hello.boudle.js:

在hello.boudle.js中,/* 0 */,/* 1 */为模块编号,webpack将打包前文件的引用替换为webpack内置的require:

新建一个style.css文件,在hello.js中对其引用,然后再次运行打包命令:

发现css文件打包失败,提示你需要一个loader来处理这个(css)文件类型;

使用npm install css-loader style-loader --save-dev 安装处理css文件的loader,然后运行

webpack hello.js hello.boudle.js:

它还是说你需要一个loader来处理这个类型的文件,因为虽然你安装了loader,但是在文件中没有去制定要使用这个loader来处理这种类型的文件:

css-loader!就是说这个文件需要经过css-loader的处理,然后再次运行打包:

这样就完成了css文件的打包;

新建一个hello.html文件,引入打包后的文件:

修改hello.js,执行hello函数:

执行打包,浏览器中打开html文件:

在css文件中加上背景色,然后重新打包运行:

你会发现并没有生成红色背景,这时你需要使用style-loader对引入的css文件进行处理:

然后打包运行,就可以了:

你会发现浏览器中head标签中多了一个style标签,这是因为css-loader是用来处理css文件,style-loader是将css-loader处理后的文件新建一个style标签插入到html里面;

css-loader也可以在命令行中指定,命令行输入webpack --help可以看到webpack的一些参数,删除require时指定的loader ,打包时将命令改为:webpack hello.js hello.boudle.js --module-bind “css=style-loader!css-loader”,发现也可以成功,并没有报错,注意windows下只能使用双引号,不然会报错,webpack是从右往左解析,所以要先使用css-loader处理然后再交给style-loader;

加上--watch参数可以使每次文件改变的时候自动执行打包;

--progress可以看到打包过程;

--display-modules可以看到打包模块,会列出每个文件通过哪个loader处理;

--display-reasons为告诉你为什么要打包这个模块;

配置webpack

新建一个webpack-test2文件,init初始化,npm install webpack --save-dev依赖安装webpack,新建一个src文件,新建一个dist文件,根目录下创建一个html文件,引入boudle.js(打包后的文件名):

src目录下创建一个script文件夹一个style文件夹用于放置js,css文件,根目录下创建一个webpack.config.js(官网上有对config的详细说明)文件:

entry:打包入口,从哪个文件开始,假设为上述文件;

output:打包后的文件;

filename:打包后的文件名(加上路径);

output中还有一个path和一个publicPath属性:

path代表路径,publicPath为要替换的路径,如上线网址:

webpack会将path替换为publicPath:

script文件夹中新建一个main.js,写一个空函数,然后命令行输入webpack打包:

这样就打包成功了;

如果将webpack.config.js文件名修改webpack.dev.config.js(或其他),可使用命令webpack --config webpack.dev.config.js;

也可以在package.json文件中的scripts下进行配置:

然后命令行使用npm run webpack:

entry

entry接受字符串(单个文件),数组和对象三种方式;

在script目录下新建一个a.js,写一个a的空函数,然后修改config.js中的entry:

运行npm run webpack:

打包成功;

将entry改为对象方式:

运行npm run webpack:

提示多个资源打包成了相同的文件名,然后前面的被覆盖,这个时候要使用output中的占位符,[name]指entry对象中的key,[hash]打包的Hash值,[chunkhash]每一个chunk的hash值;

修改config文件:

改为chunkhash,运行:

和上面不同的是两个文件hash值不同,chunkhash可以认为是版本号,只有当文件有改变的时候hash值才会改变,下面改变a.js文件,再运行打包:

可以发现a.js打包后的文件hash值变化了;

index.html中引入的文件是boudle.js,但是我们打包后的文件名可能是不确定的,所以我们需要引入webpack的插件:html-webpack-plugin,首先还是依赖注入:npm install html-webpack-plugin --save-dev,然后引入html-webpack-plugin,在module-exports中配置plugins:

之后运行npm run webpack:

可以看到已经生成了一个html文件,并且引用了生成的文件路径:

也可以对plugin进行配置,参数为一个对象:

filename:生成后的文件名;

template:模板;

Inject:需要将标签放在html哪个位置,如head、body;

title:html中的title内容;

minify:压缩文件(removeComments删除注释,collapseWhitespace删除空格);

可以在html中通过ejs模板引擎在htmlWebpackPlugin对象中获取config.js中的配置:

Html中:

config.js中:

生成的html文件:

htmlWebpackPlugin有一个files和一个options属性,可以在ejs模板中将其遍历出来查看所有属性;

多页面打包

plugins参数为一个数组,所以可以接收多个参数,如果需要生成多个html,只需要重新调用new htmlWebpackPlugin();

新建一个b.js c.js,在entry中配置如下

在plugins中:

chunks为要引入的打包后的文件路径,参数为一个数组,excludeChunks参数接收一个数组,意思为排除数组中的文件之外其他全部引入;然后npm run webpack:

然后可以看到不同的文件通过设置chunks达到了引用不同文件的效果;

通过指定chunks的方式引用的文件都是通过src引入,如果希望将一些初始化的脚本通过inline的方式插入到页面,从而减少http请求数,可以通过plugin的compilation.assets实现将script脚本通过inline的方式插入到html:

这样main.js就插入到了html中,而a、b、c.js分别通过src引用到文件中,这里要注意,将inject参数改为false,并且main作为通用模板,所有文件中chunks里面都必须包含main,不然会报错;

Loader的使用

修改目录文件:

Src根目录下有一个app.js:

src下一个conponents文件夹,下面一个layer文件夹,里面一个layer.html,一个layer.less,一个layer.js,配置一次如下:

修改config.js:

Loader的使用有三种方式,第一种是require(‘css-loader!./a.js’),通过require的方式直接在引入文件时指定loader,第二种是使用cli,就是在npm中 “style=style-loader!css-loader”,前面也有提到过,现在主要在config.js配置文件中使用loader;

在配置文件的配置中新增一个module项,此项表示使用’babel’的loader来处理已.js结尾的文件,babel是将es6语法解析为浏览器可以读取的js语法(如果报错,请参考后面的配置方式):

首先要在命令行中安装babel,npm install babel-loader babel-core babel-preset-env webpack --save-dev,配置:

注释掉html引用,不然会报错,因为没有指定处理html文件的loader:

然后运行npm run webpack,就可以看到打包成功了;

注意你的node和npm版本必须要高于某个版本,具体哪个版本不知道,安装最新的就可以了,更新node可以在官网下载最新版本,然后安装路径和之前的路径保持一致就可以了,node中带有npm,所有安装最新的node后,npm也会是最新版本;

可以看到打包成功了,打开页面也会有console的layer函数;

虽然打包的文件很少,但是打包花费的时间还是很长,因为它会把node_modules文件一起处理,可以在rules中指定include(包含范围)和exclude(排除)使打包速度加快,再运行一次打包,可以看到时间从之前的4s多变成了0.6s:

这里exclude要用正则,不然不能正确匹配,include要加上__dirname,这里只处理src下面的文件;

exclude可以的参数可以是字符串也可以是一个数组接收多个参数,参数可以是正则、字符串或者是一个函数,这个路径必须是绝对路径,这个时候需要引用node中的path:

可以达到一样的效果;

经过尝试,include使用之前的方式会快很多,所以这里include还是使用之前的方式匹配;

CSS的处理

安装css-loader和style-loader:npm install css-loader style-loader --save-dev

根目录下新建一个css文件夹用于放置css文件,新建一个common.css文件,用于公共部分css;

在app.js中引用common.css;

配置css-loader:

注意这里要指定2个loader,一个style-loader和一个css-loader,并且style-loader在前,不然会报错,无法正常解析;

在一些css属性需要浏览器兼容的时候,可以借助postcss-loader自动为这些需要兼容的属性加上前缀,比如我们在css文件中加上一个flex属性,安装postcss-loader并配置:

npm install postcss-loader --save-dev

npm install autoprefixer --save-dev(这个是postcss的插件,用于添加前缀);

browsers为要兼容的浏览器版本,’last 5 versions’为最近的5个版本;

如果一个文件是通过@import的方式引入,这种方式就不会生成前缀,新建一个flex.css,并设置一个flex属性,然后从common.css 中@import flex.css:

可以看到这是并没有被正确的添加前缀:

新建一个postcss.config.js:

webpack.config.js配置如下:

这是通过@import引入的文件也会被正确的添加上前缀了;

less-loader

首先还是安装less-loader:npm install less-loader --save-dev

如果没有安装less,还要安装less:npm install less --save-dev

layer.js中引入layer.less,config.js中配置如下:

webpack2和1配置有点不一样,1.x可以直接使用

{

test:/\.less$/,

loader:’style-loader!css-loader!postcss-loader!less-loader’

}

注意两种配置的顺序都不能变,相当于从下往上解析,先处理less,然后postcss添加前缀,然后处理css,最后style标签插入,顺序不能变;

在使用@import时,上面箭头处可以省略css-loader中的importLoaders属性,less-loader会自动处理,不需要添加处理css时的importLoaders属性;

打包成功后再浏览器中可以看到多了一个style标签,里面就是less文件解析出来的内容;

@import less文件时,不加importLoaders,也会正确的加上前缀;

sass同理,test属性值为/\.scss$/,因为sass是scss文件,其他配置和less相同;

处理模板文件

安装loader:npm install html-loader --save-dev

修改文件:

Index.html中添加一个div,id为app:

layer.js:

app.js:

layer.html:

config.js:

然后运行npm run webpack,页面可以正常显示了;

使用模板引擎

ejs为例,修改layer.html为layer.ejs,修改代码:

安装ejs-loader:npm install ejs-loader --save-dev

config.js,这里不一定要叫ejs,也可以取见名知意的tpl代表template,因为可以是其他模板引擎:

app.js中:

在tpl中传入需要的参数,运行打包命令,刷新页面,可以看到页面被正确的解析了;

图片的处理

在src目录下新建一个assets文件夹,放入一张图片,在layer.less中的div下使用相对路径设置背景图片,安装file-loader,配置config.js:

运行npm run webpack:

可以看到图片已经被打包了;

在index.html中添加一张图片,打包,可以看到图片也可以被正确的解析:

然后再.ejs文件中同样添加一张图片,打包,刷新页面;

可以看到图片没有被正确的显示,并且控制台报错没有找到文件,可以看到css和html中的图片路径是经过webpack处理替换掉了,但是模板中的图片路径没有被正确的替换导致找不到文件;

这是可以使用传参的方式,${}为es6的模板字符串传参方式,可以在{}中写简单的逻辑运算:

重新打包,刷新页面,可以看到图片可以正常显示,并且路径也被替换;

file-loader中也有一些参数可以配置,比如:

使用以上配置,图片会被保存在dist文件夹下新建的一个assets文件目录下,[name]为文件名,[hash:5]表示hash值得前5位,[ext]表示文件的后缀名:

url-loader

url-loader有一个limit配置项,表示当你的文件或图片大于指定大小的时候,它会交给file-loader去处理,如果文件或图片小于这个值,它会将其转换为base64的格式:

npm安装url-loader,并配置,先将前面的file-loader修改,并配置limit属性为300k,因为我前面图片的大小为290k多,打包并运行:

前面为之前打包后文件大小,可以看到打包后文件明显变大了很多,是因为文件类型发生了改变,图片也被打包到了html ejs文件中,页面上可以看到鼠标移入图片路径时会显示一段base64编码,但是页面效果没有任何变化;

图片压缩

安装image-webpack-loader,配置:

运行打包:

可以看到文件明显变小了,我们换回file-loader:

可以看到图片从之前的296k被压缩到只有103k;

image-webpack-loader对每一种图片格式都有具体的参数进行优化,具体可以参考官网。

最后附一张package.json和config.js图:

相关文章

  • webpack学习总结

    Webpack学习总结 此文只是自己学习webpack的一些总结,方便自己查阅,阅读不变,非常抱歉!! 下载安装:...

  • 【01】webpack4.0教程_基础_1

    学习webpack4.0的笔记,循序渐进,后续会再做系统总结 [toc] webpack安装 总结 安装本地的we...

  • webpack总结 & 个人理解

    目录: 学习资源 概念总结 webpack必要元素 webpack其他元素 遇到的问题 常见loader整理 常见...

  • webpack学习总结

    webpack介绍 webpack是一个javascript静态模块打包器(module bundle)当webp...

  • webpack 学习总结

    webpack 干嘛用的? index.js 依赖 a.js,a.js 依赖 b.js,b.js 依赖 c.js,...

  • webpack学习总结

    webpack官网:http://webpack.github.io/http://webpack.github....

  • webpack学习总结

    webpack-dev-server 只在开发模式下启用,其他模式下不启用。 webpack 有模块热更新功能 w...

  • webpack学习总结

    1-1.webpack究竟是什么? webpack其实就是一个模块打包器。 1-2.什么是模块打包工具? 1-3....

  • 上手webpack,有这个教程就可以了

    最近一直在学习webpack的基础知识,从以下5个大的点进行总结。 1.什么是webpack?2.学习webpac...

  • webpack学习总结01

    webpack打包原理 webpack只是一个打包模块的机制,只是把依赖的模块转化成可以代表这些包的静态文件。并不...

网友评论

      本文标题:webpack学习总结

      本文链接:https://www.haomeiwen.com/subject/wosmrxtx.html