在当前grunt、gulp、webpack成为平常工具的状况下,若是你还只是熟练的使用html、css和激块瑞的话,已经远远不能知足项目的需求,因此你得变强,你须要懂得更多。如今前端不只仅是用那几句蹩脚的JavaScript代码在浏览器渲染几个页面而后提交几个表单在写点交互了。如今WebGL协议能够为HTML5 Canvas提供硬件3D加速渲染,你能够用JavaScript语法能够渲染3D模型,你也能够用nodejs搭建后台,还能够用react-native、weex作一个app。js发展的也愈来愈像后台语言,毕竟js已经将它的魔爪伸到了不少领域,这让你能够猥琐欲为。。。确实每一个前端都应该有一统前端界的野心,寄人篱下只是暂时的 ⌒_⌒....javascript
webpack是现代JavaScript应用程序的静态模块打包工具
,webpack是经过npm来安装的,npm是跟node一块儿下载的包管理工具,因此你得保证电脑上已经安装了node。在安装以前先来讲下cnpm,由于npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,那下载速度让人不禁得喊一声“王德发”,因此咱们‘伟大的’淘宝团队干了一件伟大的事:“这是一个完整 npmjs.org 镜像,你能够用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽可能与官方服务同步。” 你只要执行如下命令:css
$ npm install -g cnpm
用了cnpm以后那速度让人爽得不要不要的,不再用担忧摔键盘的问题了。html
那么下面就来介绍一下webpack的安装,安装包括本地安装和全局安装(我用的是webpack4版本):前端
全局安装(全局安装是安装到你C盘里,在任何地方均可以使用):java
cnpm i webpack -g
本地安装(是安装到当前目录,只能在当前目录使用):node
cnpm i webpack -D //i 是install 的缩写
若是你想安装webpack特定的版本,好比说2.2:react
cnpm i webpack@2.2 -D
在之前的版本中webpack和webpack-cli是一体的,但在webpack4中,它把webpack和它的cli分开来以方便于管理,因此还须要安装:webpack
cnpm i webpack-cli -D
到这里咱们已经怀着美滋滋的心情介绍完webpack的安装方法了,如今介绍一下webpack的基本概念,它的基本概念有四个,是的只有四个,你没有看错(是否是很高兴?你高兴的太早了):git
entry:顾名思义就是入口,就好像一个口袋的袋口,要装东西(好比说一支笔)进去就要经过这里。github
output:确定就是出口啦,你把一个装笔的袋子拿绳子捆起来后放到一个地方,这个地方就是出口。
loader:这个单词的意思是装货的人
,那么在这里就是指的是那个装笔的人,意思是由于笔不可能本身跑进袋子里,须要一我的代劳。其实正确的解释是webpack自身只能理解javascript,它不认识这支笔是什么东西,因此就须要loader告诉webpack这是一支笔,那么webpack就能理解这支笔了。
plugins:这个就是插件,咱们对插件确定很熟悉了,在项目中咱们用过不少各类各样的插件,它能够用来处理各类各样的任务。
介绍完了webpack的安装以及概念,让咱们释放一下蠢蠢欲动的心作一个小项目吧:
mkdir webpack_lesson_one
cd webpack_lesson_one
npm init -y
cnpm i webpack webpack-cli -D
index.html
和一个webpack的配置文件webpack.config.js
以及一个资源文件夹src
,完成以上流程之后咱们的目录应该是这个样子的:src
目录里面新建一个入口文件index.js
,而后编辑文件如图:webpack.config.js
:const path = require('path'); module.exports = { entry:{ //入口文件配置,固然这里能够配置多个入口文件,在此对象内增长增长键值对便可 app: './src/index.js' }, output:{ //出口文件配置 filename:'[name].bundle.js', path: path.resolve(__dirname, 'dist') } } //path.resolve()是nodejs中的语法,拼接路径, __dirname表明项目根目录
"scripts"
命令,以下:接下来在根目录的index.html
中引入app.bundle.js
:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script src="dist/app.bundle.js"></script> </body> </html>
npm run build
接下来就是见证奇迹的时刻了,你的项目根目录会生成dist
文件夹,浏览器运行index.html
就会看到hello world!
,那么咱们的一个超级森破的项目就这样完成了。
在介绍上面几个功能前先说一下项目目录的合理分配,一个合适的项目目录能够下降总体项目的依赖性,大大提升工做中的开发效率,因此资源管理必定作好。那么在src
目录中新建components
目录,而后新建文件以下:
|- /src |- |- /components |- | |- /News |- | |- |- /img |- | |- |- index.js |- | |- |- style.css |- index.js
style-loader
和css-loader
以及file-loader
:cnpm i style-loader css-loader file-loader -D
webpack.config.js
中配置:const path = require('path'); module.exports = { entry:{ app: './src/index.js' }, output:{ filename:'[name].bundle.js', path: path.resolve(__dirname, 'dist') }, module:{ rules:[ { test:/\.css$/, use:['style-loader', 'css-loader'] //这里须要注意下,style-loader 必需要写在 css-loader 以前哟 }, { test:/\.(jpg|png|gif|svg)$/, use:[ { loader:'file-loader', options:{ name:'img/'+'[name].[ext]?[hash]', //能够重写css中引入图片部分 publicPath: 'dist/' //能够从新生成图片到新的目录 } } ] } ] } }
咱们来修改src
目录下的index.js
编写News
目录下的style.css
文件
body{ background: #fff url(img/banben.png) 0 0 no-repeat; }
编写News
目录下的index.js
文件
import './style.css'; console.log('有一天我但愿站在这个世界的顶端说出八个大字:个人,个人,都是个人!');
如今你再运行npm run build
命令,再运行index.html
看看是否是这样的效果(啊,多么漂亮的图标啊!):
再看看里面加载的css:
图片后面自动加上了参数,这就是上面的配置项name:'img/'+'[name].[ext]?[hash]'
的做用。你能够去看看file-loader的使用方法,让咱们姿式一块儿涨,1(yao)3(san)一块儿装。
webpack.config.js
文件:const path = require('path'); module.exports = { entry:{ app: './src/index.js' }, output:{ filename:'[name].bundle.js', path: path.resolve(__dirname, 'dist') }, module:{ rules:[ { test:/\.css$/, use:['style-loader', 'css-loader'] //这里须要注意下,style-loader 必需要写在 css-loader 以前哟 }, { test:/\.(jpg|png|gif|svg)$/, use:[ { loader:'file-loader', options:{ name:'img/'+'[name].[ext]?[hash]', //能够重写css中引入图片部分 publicPath: 'dist/' //能够从新生成图片到新的目录 } } ] }, { test:/\.(woff|woff2|eot|otf|ttf)$/, use:['file-loader'] } ] } }
src
目录下新建public
文件夹,放入字体文件资源:src
目录下的index.js
引入字体css文件:index.html
中添加字体标签:再去News
里改变一下字体的大小,作人就是要大气一些:
而后再npm run build
一下看看字体图标已经加载出来了!!!
咱们已经能加载图片了,那么试着压缩一下吧,毕竟浓缩的才是精华、O(∩_∩)O哈哈~。。另附直通车image-webpack-loader,一条龙式服务必须滴。
仍是老样子,固然仍是先安装image-webpack-loader
cnpm i image-webpack-loader -D
修改webpack.config.js
module里的rules:
module:{ rules:[ { test:/\.css$/, use:['style-loader', 'css-loader'] }, { test:/\.(jpg|png|gif|svg)$/, use:[ { loader:'file-loader', options:{ name:'img/'+'[name].[ext]?[hash]', publicPath: 'dist/' } }, { //压缩图片要在file-loader以后使用 loader:'image-webpack-loader', options:{ bypassOnDebug: true } } ] }, { test:/\.(woff|woff2|eot|ttf|otf)$/, use:['file-loader'] } ] },
如今你npm run build
以后看看dist
文件夹内的banben.png
和以前的图片大小对比,是否是小了一半,就是这么方便。
file-loader
里的name
参数变一下:{ loader:'file-loader', options:{ name:'img/'+'[hash].[ext]', //把[name] 换成 [hash] publicPath: 'dist/' } }
这样咱们生成的文件是一个以哈希值命名的图片,当咱们改变原图片名字的时候再打包后会从新生成一个图片文件,可是以前生成的依然还在那里一动不动。这个时候咱们就须要用到clean-webpack-plugin了,固然这个是插件
不是loader
哟~ 那就让咱们来安装吧:
cnpm i clean-webpack-plugin -D
webpack.config.js
const path = require('path'); const CleanWebpackPlugin = require('clean-webpack-plugin'); //插件是须要引入的,这里可别忘了引入 module.exports = { entry:{ app: './src/index.js' }, output:{ filename:'[name].bundle.js', path: path.resolve(__dirname, 'dist') }, module:{ rules:[ { test:/\.css$/, use:['style-loader', 'css-loader'] }, { test:/\.(jpg|png|gif|svg)$/, use:[ { loader:'file-loader', options:{ name:'img/'+'[hash].[ext]', publicPath: 'dist/' } }, { loader:'image-webpack-loader', options:{ bypassOnDebug: true } } ] }, { test:/\.(woff|woff2|eot|ttf|otf)$/, use:['file-loader'] } ] }, plugins:[ new CleanWebpackPlugin(['dist/img']) //数组内的是须要清理的目录 ] }
来来来,咱们npm run build
一下,是否是你的img
文件消失一下后又从新浮如今你的眼前了,若是没有消失过多是你的眼花了。
固然你还能够设置其它参数,详见clean-webpack-plugin
plugins:[ new CleanWebpackPlugin(['dist/img'],{ exclude: [ 'banben.png' ] //这个配置意思就是不删除 img 文件里面的 banben.png 图片 }) ]
如今本期webpack笔记已经到此结束了,另附上github项目练习素材地址:https://github.com/zgf123/web...
webpack遵循commonJs规范,每一个文件就是一个模块,有本身的做用域。在一个文件里面定义的变量、函数、类,都是私有的,对其余文件不可见。CommonJS规范规定,每一个模块内部,module变量表明当前模块。这个变量就是一个对象,它的exports属性就是对外的接口,所谓加载某个模块,其实就是加载这个模块的modules.exports属性。