webpack学习笔记
这是一份学习笔记,仅此记录一个学习过程
理解 WebPack
学习 WebPack 最好是从服务端的角度出发,或者说从 node 角度出发,到程序的角度,再到用户的角度;
反过来,一部分用户是不需要一些渲染的页面的,那么从服务端开始,编写用户需要的页面;
package.json 文件
package.json 是一个 node 生成的目录文件,下面 vue-cli 生成的一个 package.json;
{
"name": "vue-test",
"version": "1.0.0",
"description": "A Vue.js project",
"author": "yg_zinger",
"private": true,
"scripts": {
//more
},
"dependencies": {
"vue": "^2.5.2",
"vue-router": "^3.0.1"
},
"devDependencies": {
// more ...
"url-loader": "^0.5.8",
"vue-jest": "^1.0.2",
"vue-loader": "^13.3.0",
"vue-style-loader": "^3.0.1",
"vue-template-compiler": "^2.5.2",
"webpack": "^3.6.0",
"webpack-bundle-analyzer": "^2.9.0",
"webpack-dev-server": "^2.9.1",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 4.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
常见字段解析
字段 | 解析 |
---|---|
name | 项目名 |
version | 项目版本号,(大改,次改,小改) |
author | 作者名字 |
script | 调用命令脚本,封装功能用 |
dependencies | 项目运行所需的依赖包 |
devDependencies | 项目开发所需的依赖包 |
engines | 制定包的运行环境 |
browserlist | 浏览器兼容性问题 |
config | 用于添加命令行的环境变量 |
private | 设置为ture 表示不发布到 npm 平台下 |
主要配置
如果是个人配置,大可不必使用脚手架,以及前端框架,把 webpack 当作一个打包工具即可;
个人配置上面不需要太复杂,就拿一个 webpack.config.js 来看即可
//导入所需的依赖
var FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var webpack = require('webpack')
var path = require("path")
//模块输出
module.exports = {
// 入口, 可以是字符串,数组,对象
entry: './src/mian.js',
// 输出配置, 一般有 filenema=输出名字, path=输出地址, publicPath=输出公共资源的路径 字段
output: {
path: __dirname + '/dist',
publicPath: '/static/',
filename: 'build.js'
},
// 插件
plugins: [
new webpack.ProgressPlugin(),
new FriendlyErrorsWebpackPlugin()
],
// 模块处理
module: {
// 字段配置
rules: [{
//test = 正则匹配规则, use = 匹配对应 loader or 对象 options
test: /\.vue$/,
use: {
loader: "vue-loader",
options: {
loaders: {
css: ExtractTextPlugin.extract({
use: 'css-loader'
}),
stylus: ExtractTextPlugin.extract({
use: ["css-loader", "scss-loader"]
})
}
}
}
}, {
test: /\.css$/,
use: ['vue-style-loader', 'css-loader', 'scss-loader']
}, {
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: [{
loader: "url-loader",
options: {
limit: 10000,
name: 'images/[name].[hash:7].[ext]' // 将图片都放入images文件夹下,[hash:7]防缓存
}
}]
}, {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
use: [{
loader: "url-loader",
options: {
limit: 10000,
name: 'fonts/[name].[hash:7].[ext]' // 将字体放入fonts文件夹下
}
}]
}, {
test: /\.js$/,
use: "babel-loader",
include: [path.resolve(__dirname, 'src')]
}]
}
}
// 压缩 javascript 的插件
new webpack.optimize.UglifyJsPlugin()
// 抽离 css 到css 文件
new ExtractTextPlugin({
filename: "css/style.css"
})
plugins 常用插件
现在大部分插件都会在 webpack 上面集成好,所以 webpack文档 就很关键了,多看文档多成长;
下面介绍部分常用的,也是使用一些脚手架常见的插件,与个人理解;
对代码处理的插件
插件 | 用处 |
---|---|
BannerPlugin | 给代码添加版权信息 |
CommonsChunkPlugin | 用于共享抽离代码,整个项目的第三方;多个子 chunk 共用打包进入 父 chunk;Mainfest 每次打包都有变化 |
CompressionWebpackPlugin | 使用配置算法 |
DefinePlugin | 允许在编译时(compile time)配置的全局常量 |
EnvionmetPlugin | 通过 DefinePlugin 来设置 process.env 环境变量的快捷方式 |
ProvidePlugin | 自动加载模块,不需要 import 或者 require |
UglifyJsPlugin | 自动压缩 JS 代码(需要安装,不自带) |
辅助打包后的代码
插件 | 用处 |
---|---|
HtmlWebpackPlugin | 自动依据 entry 的配置引入依赖(需要安装,不自带) |
cleanWebpackPlugin | 每次打包,清空配置的文件夹,包名保持不一致 (需要安装,不自带) |
辅助开发的相关属性
属性 | 用处 |
---|---|
devtool | 打包后的代码与原始代码不同,控制是否生成 & 如何生成 |
devServer | 打开本地服务器,需要配置 |
watch | 持续监听文件的更改,重新构建文件,开发时期使用 |
watchOptions | 定制 watch 模式 |
performance | 展示性能提示 |
stats | 配置打包过程输出的内容,值:none,norml,rerbese,errors-only |
精细的相关属性配置
属性 | 用处 |
---|---|
content | 设置基础路径,默认当前 |
resolve | 确定某块如何被解析,有默认值,可自定义 |
target | 打包之后代码所执行的环境 |
extemals | 控制某个依赖,不打包,直接从用户环境获取 |
结语
基本上到这里了,这里大部分东西都在 Webpack社区 里可以查得到,习惯用了脚手架,会让突然出现的错误,措手不及,所以我们需要学习,和记录;
当然,最近出了个 Parcel ,貌似更好用…有机会试一下