WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Sass,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。在3.0出现后,Webpack还肩负起了优化项目的责任。
npm init
npm i -D webpack
./node_modules/.bin/webpack -v
// 或者全局
npm i -g webpack
webpack -v
第一条命令
webpack {entry file} {destination for bundled file}
webpack src/entry.js dist/bundle.js
编写 webpack.config.js
module.exports={
//入口文件的配置项,可以是单一入口,也可以是多入口。
entry:{},
//出口文件的配置项
output:{},
//模块:例如解读CSS,图片如何转换,压缩
module:{},
//插件,用于生产模版和各项功能
plugins:[],
//配置webpack开发服务功能
devServer:{}
}
配置好,执行 webpack
同时支持多入口,多出口配置
output: {
filename: '[name].js'
}
- 设置 webpack-dev-server
npm install webpack-dev-server –save-dev
在 webpack.config.js 中配置服务参数
devServer:{
//设置基本目录结构,用于找到程序打包地址。
contentBase:path.resolve(__dirname,'dist'),
//服务器的IP地址,可以使用IP也可以使用localhost
host:'localhost',
//服务端压缩是否开启
compress:true,
//配置服务端口号
port:1717
}
本地的 webpack-dev-server 不能直接执行
"scripts": {
"server":"webpack-dev-server",
"webpack":"webpack"
},
执行 npm run server , 并打开浏览器 localhost:1717
- 支持热更新
webpack 3.6之前的热更新不是默认的,需要额外配置
Loaders是Webpack最重要的功能之一,他也是Webpack如此盛行的原因。通过使用不同的Loader,Webpack可以的脚本和工具,从而对不同的文件格式进行特定处理。
作用:
- SASS --> CSS
- ES6/7 --> ES5
- JSX --> JS
配置写在 webpack.config.js 中的 module.rules 属性中
module:{
rules: [
{
// 用于匹配处理文件的扩展名的表达式,这个选项是必须进行配置的;
test: /\.css$/,
// loader名称,就是你要使用模块的名称,这个选项也必须进行配置,否则报错;
use: [ 'style-loader', 'css-loader' ],
手动添加必须处理的文件(文件夹)或屏蔽不需要处理的文件(文件夹)(可选)
include/exclude:,
为loaders提供额外的设置选项(可选)
query:,
}.
...ohters
]
}
配置css-loader 和 style-loader 就可以使用
import css from './css/index.css';
npm i -D style-loader 所有的计算后的样式加入页面中
npm i -D css-loader css-loader使你能够使用类似@import和url(...)的方法实现require的功能
loader 有三种写法:
module:{
rules:[
{
test:/\.css$/,
// 1)
use:['style-loader','css-loader']
// 2)
loader:['style-loader','css-loader']
// 3)
use: [{
loader: "style-loader"
}, {
loader: "css-loader"
}]
}
]
}
uglifyjs-webpack-plugin(JS压缩插件,简称uglify) 注意:虽然uglifyjs是插件,但是webpack版本里默认已经集成,不需要再次安装。
直接引入 const uglify = require('uglifyjs-webpack-plugin');
plugins:[ new uglify() ],
移动 index.html 去掉 js 的引入
取而代之的 html-webpack-plugin 插件
npm install --save-dev html-webpack-plugin
new htmlPlugin({
// 是对html文件进行压缩,removeAttrubuteQuotes是却掉属性的双引号。
minify:{
removeAttributeQuotes:true
},
// 为了开发中js有缓存效果,所以加入hash,这样可以有效避免缓存JS
hash:true,
// 是要打包的html模版路径和文件名称
template:'./src/index.html'
})WE
npm run server 不会在生成任何文件了
css 中的图片
npm install --save-dev file-loader url-loader
file-loader:解决引用路径的问题,拿background样式用url引入背景图来说,我们都知道,webpack最终会将各个模块打包成一个文件,因此我们样式中的url路径是相对入口html页面的,而不是相对于原始css文件所在的路径的。这就会导致图片引入失败。这个问题是用file-loader解决的,file-loader可以解析项目中的url引入(不仅限于css),根据我们的配置,将图片拷贝到相应的路径,再根据我们的配置,修改打包后文件引用路径,使之指向正确的文件。
url-loader:如果图片较多,会发很多http请求,会降低页面性能。这个问题可以通过url-loader解决。url-loader会将引入的图片编码,生成dataURl。相当于把图片数据翻译成一串字符。再把这串字符打包到文件中,最终只需要引入这个文件就能访问图片了。当然,如果图片较大,编码会消耗性能。因此url-loader提供了一个limit参数,小于limit字节的文件会被转为DataURl,大于limit的还会使用file-loader进行copy。
{
test:/\.(png|jpg|gif)/ ,
use:[{
loader:'url-loader',
options:{
// 是把小于500000B的文件打成Base64的格式,写入JS
limit:500000
}
}]
}
有些场合得把CSS分开
npm install --save-dev extract-text-webpack-plugin
new extractTextPlugin("/css/index.css")
使用 http://0.0.0.0:1717 可以代替 localhost:1717
改变图片打包路径:
loader:'url-loader',
options:{
limit:5000,
outputPath:'images/',
}
修改 .gitignore
git rm -r --cached . git add . git commit -m 'update .gitignore'
img 图片路径问题使用 html-withimg-loader
{
test: /\.(htm|html)$/i,
use:[ 'html-withimg-loader']
}
background-iamge 也会有路径问题 在
use: extractTextPlugin.extract({
fallback: "style-loader",
use: "css-loader",
publicPath: '/', // 注意配置这一部分,根据目录结构自由调整
})
npm install --save-dev less less-loader
{
test: /\.less$/,
// use: [{
// loader: "style-loader" // creates style nodes from JS strings
// }, {
// loader: "css-loader" // translates CSS into CommonJS
// }, {
// loader: "less-loader" // compiles Less to CSS
// }]
use: extractTextPlugin.extract({
use: [{
loader: "css-loader"
}, {
loader: "less-loader"
}],
// use style-loader in development
fallback: "style-loader"
})
}
把 less 编译后单独打包