直接上图css
简言之:webpack能够作以下的事情html
一句话:打包全部的资源node
webpack是基于Node的, 在安装Webpack以前须要安装Node环境, 这里就不赘述了。安装成功后打开CMD控制台,输入以下命令验证是否安装成功webpack
在这里安利一个node版本管理插件 nvm
, 能够实现本地多个node 版本自由转换git
建立你的项目目录, 在当前目录下执行 npm init, 初始化项目目录环境,生成 package.jsongithub
package.json里存放着当前项目的相关信息,包含 版本号,开发者,开发环境依赖,生产环境依赖,在这里咱们重点关注 scripts
, webpack构建命令在这里配置。web
执行 npm install webpack webpack-cli -D , 其中 -D 也就是 --save-dev, 若是是要做为生产环境的依赖则是 --save 便可npm
安装成功后, 在 package.json 文件 会保存对应的安装信息json
笔者当前使用的是 webpack4.0+, 在 webpack 4 中,能够无须任何配置使用也就是 0配置,然而大多数项目会须要很复杂的设置,因此 webpack 仍然支持使用配置文件的方式。浏览器
首先在项目目录下建立 src
目录,而后建立 index.js
, webpack4 构建的默认入口文件 src/index.js
此时,就能够发挥webpack的构建效果啦。 执行 npx webpack, 构建成功后会在项目目录下自动生成一个dist目录,同时生成构建后的js文件:
main.js
, 默认名字,不用担忧,这个是能够修改的哟。
科普时间:
1. npm 5.2.0 版本中内置了伴生命令:npx,相似于 npm 简化了项目开发中的依赖安装与管理
2. npx 会自动查找当前依赖包中的可执行文件,若是找不到,就会去 PATH 里找。若是依然找不到,
就会帮你安装, 这里的PATH 就是项目 node_modules
3.若是npm版本较低,能够全局安装 npm install -g npx
复制代码
至此你已经学会如何使用 webpack 这门武林秘籍啦。那咱们在浏览器中看看效果吧。咱们在dist目录手动建立一个index.html, 同时引入 main.js
经过查看构建后的main.js文件,能够看到是压缩后的代码,这是由于 webpack 提供了不一样的打包
mode
npx webpack --mode production //构建用于发布的代码, 代码会压缩
npx webpacck --mode development //开发过程当中构建代码, 代码不压缩
复制代码
在项目根目录下建立 webpack.config.js, 前面提到过 webpack 是基于 node环境的, 因此一样采用的是 Commonjs 包管理规范。
module.exports = {
entry: '', //打包入口文件,
output: {}, //打包出口文件,
plugins: [], //配置插件
module: {
rules: [] //配置各类用于源文件编译加载的loader
},
devServer: {} //配置开发静态http服务
}
复制代码
以下配置,执行 npx webpack --mode development, 一样也能够构建成功
let path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
}
}
复制代码
构建后会生成如图文件
若是想保持和源文件相同的名字则能够这样配置 '[name].js', 若是要加上hash值,则 '[name].[hash].js'
let path = require('path');
module.exports = {
entry: {
index: './src/index.js }, output: { filename: '[name].[hash].js', path: path.resolve(__dirname, 'dist') } } 复制代码
上面在验证构建后js是采用的手动方式去建立 html, 并手动引入,若是webpack这么弱,那也太弱了吧。哈哈哈...
那该怎么解决这个问题呢?下面咱们就要用到插件: html-webpack-plugin, 首先得安装这个插件
npm i html-webpack-plugin
, 能够去npm官网看看其用法。
引入并调用该插件。执行npx webpack命令。则会帮你在dist目录,自动建立相应的html和js, 并自动引用相应的静态资源文件.
再说说
new HtmlWebpackPlugin({
filename: 'a.html', //构建后生成的文件的名字
chunks: ['index'], //构建时所用到的js源文件, 与 entry 中的 key 一一对应
template: './src/index.html', //所用到的html源文件,主要是考虑到一个项目中可能有多个html文件
hash: true, //自动给构建后的html文件中的js, css等引入路径加上hash值,相似get请求中加上时间戳
}),
复制代码
* 安装插件 npm i extract-text-webpack-plugin@next -D
* 安装相应的css loader : npm i style-loader css-loader -D
* 在index.js中文件引入 index.css 文件
* 在webpack.config.js中引入插件
复制代码
style 标签载入 css文件
plugins: [
cssExtract,
new HtmlWebpackPlugin()
],
module: {
rules:[
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
}
]
}
复制代码
以link方式载入css文件,也就是抽离css文件
{
test: /\.css$/,
use: cssExtract.extract({
fallback: 'style-loader',
use: [{
loader: 'css-loader',
}]
})
}
复制代码
css 文件的处理就到这里,其余css文件,好比 less-loader, sass-loader, 后面做一个专题再展开讨论
优化css加载插件 npm i purifycss-webpack purify-css -D
html文件中引入img 标签, 这里须要用到 html-withimg-loader
npm i html-withimg-loader -D
复制代码
{
test: /\.(png|gif|jpg)$/,
use: [{
loader: 'url-loader'
}]
},
{
test: /\.html/,
// 处理html中的图片loader
use: 'html-withimg-loader'
}
复制代码
构建后dist目录下的 html 中的 img标签
<img src="data:image/png;base64,...'/> 复制代码
固然大多数状况下,会选择将引用的图片构建在 dist/images 目录中,此时只需将上述配置稍加修改便可
{
test: /\.(png|gif|jpg)$/,
use: [{
loader: 'url-loader',
options: {
limit: 5, //
outputPath: 'images/' //构建后的目标目录
}
}]
},
{
test: /\.html/,
// 处理html中的图片loader
use: 'html-withimg-loader'
}
复制代码
区分下 url-loader 和 file-loader的差异
The url-loader works like the file-loader, but can return a DataURL if the file is smaller than a byte limit.
复制代码
示例说明: 在src/index.css中有以下代码
div{ background: url(1.png) }
复制代码
若是将 limit 设置为 0 时, 构建后 dist/index.css 代码为:
div{ background: url(data:image/png;base64,....) }
复制代码
当limit不为0时, url-loader 和 file-loader 做用同样
--------------------------------华丽的分割线--------------------------------------
看到这里,webpack的最经常使用的几种用法都已介绍完成。在实际开发过程当中,为了提升效率。最好在真正开发前配置好这些。
先安装npm i webpack-dev-server -D
,同时在webpack.config.js中配置:
devServer: {
contentBase: './dist',
host: 'localhost',
port: 4000,
open: true,
hot: true // 还须要配置一个插件 HotModuleReplacementPlugin
}
复制代码
执行 npx webpack-dev-server
, 便可看到浏览器自动打开,并加装构建后的html文件。
那如何才能真正地自动构建,自动刷新,解放双手呢? webpack 内置插件 HotModuleReplacementPlugin new webpack.HotModuleReplacementPlugin()
删除构建的历史文件,可使用 插件 clean-webpack-plugin
webpack 常见的基本用法如文中所述。在下一章中将带小伙伴们进一步探讨webpack高级应用。欢迎拍砖~~~