前端项目工程化和webpack 4.0总结 (一)
webpack 4.0总结
前言:项目工程化就是项目自动化,能用几行命令行来给我们执行压缩、转换、分类等繁琐的纯体力劳动,之前有gulp,grunt等工具执行压缩等操作,但是不够全面,直到神器webpack的诞生, 使用webpack就解决前端一大半工程化的问题
webpack 前端工程化配置
webpack 四大能力
- 打包 把所有文件打包到相对集中的一个目录,利于访问加载,对模块化特别友好
- 运行 启用一个本地服务
- 转换 转化less => css es6 => ex5 代码
- 自动化 也是其一个特点
webpack配置项
- entry 打包入口(输入我们辛辛苦苦写的代码)
- output 打包出口(输出webpack给我们包装后的代码)
- library 库名(发布npm包的时候配置)
- libraryTarget 导出库的类型, umd, commonjs等
- libraryExport
- module 模块
- rules 配置loader (想要webpack干什么活,在这边配置)
- plugins 配置插件,webpack 主要能力之外的扩展
- resolve 解析文件引用的模块的配置
- modules 模块的根目录
- extensions 自动补充的后缀,引入模块时候可以不写
- alias 模块解析时候的别名
- devServer 本地开发服务相关配置
- proxy 代理服务配置
- contentBase 运行服务虚拟文件地址
- compress 是否开启gzip压缩
- https 是否开启https
- optimization 优化项
- minimize 是否开启
- minimizer 执行插件
配置样例:有些简单的就没写
const HtmlWebpackPlugin = require('html-webpack-plugin')
const path = require('path')
const VueLoadPlugin = require('vue-loader/lib/plugin')
module.exports = {
mode: 'development',
entry: {
app: './view/index.js'
},
output: {
path: path.resolve(__dirname, '../lib'),
filename: '[name].js',
library: 'cloudWords',
libraryTarget: 'umd',
libraryExport: 'default'
},
devServer: {
port: 3000
},
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
include: /\.min\.js$/
})
]
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.js$/,
use: 'babel-loader',
exclude: path.resolve(__dirname, 'node_modules/')
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
limit: 10000,
name: 'images/[name].[ext]'
}
}],
exclude: path.resolve(__dirname, 'node_modules/')
},
{
test: /\.(woff|woff2|svg|eot|ttf|otf)$/,
exclude: path.resolve(__dirname, 'node_modules/'),
use: [{
loader: 'file-loader',
options: {
limit: 10000,
name: 'fonts/[name].[ext]'
}
}]
},
{
test: /\.css$/,
use: [
'vue-style-loader',
{ loader: 'css-loader', options: { importLoaders: 1 } }
],
exclude: path.resolve(__dirname, 'node_modules/'),
}
]
},
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html',
template: path.resolve(__dirname, '../view/index.html')
}),
new VueLoadPlugin()
],
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': path.resolve(__dirname, '../src'),
}
}
}
前端其他的工程化应用
git hook 工具
配置 test 命令
// 配置了test命令,当执行test命令的时候,执行代码错误修复和单元测试
"scripts": {
"serve": "webpack-dev-server --config build/webpack.dev.config --color --progress",
"build": "webpack --config build/webpack.build.config.js",
"lint": "eslint",
"test: unit": "jest",
"test": "npm run lint && npm run test:unit"
}
配置husky命令
安装 npm install -D husky 配置
{
"husky": {
"hooks": {
"pre-commit": "npm run test", // 在commit之前先执行npm run test命令
"commit-msg": "commitlint -e $HUSKY_GIT_PARAMS" // 校验commit时添加的备注信息是否符合我们要求的规范
}
}
}
standard version 标准化版本管理工具
这种工程化配置多用于插件开发和npm包开发
安装
npm i -g standard-version
使用
{
"scripts": {
"release": "standard-version"
}
}
运行步骤和配置
- commit 时候创建tag
- 自动生成 changlog.md 和 更改 package.json 版本
- push 代码时候将生成的 changlog.md 和 更改 package.json 一并提交
配置
// .versionrc
{
"skip": { // 跳过的步骤
"changelog": true
}
"types": [
{"type": "chore", "section":"Others", "hidden": false},
{"type": "revert", "section":"Reverts", "hidden": false},
{"type": "feat", "section": "Features", "hidden": false},
...
]
}
发布自动化
发布包的时候 每次都要 npm login 非常麻烦,可以使用 shelljs 来自动登录,话不多说,直接上代码
// npm_login.js
const shell = require('shelljs')
function npmLogin () {
const username = '***';
const password = '***';
const email = '****';
const inputArray = [
username + "\n",
password + "\n",
email + "\n",
]
const child = shell.exec('npm login', { async: true })
child.stdout.on('data', (chunk) => {
const cmd = inputArray.shift();
if (cmd) {
shell.echo("input " + cmd);
child.stdin.write(cmd);
} else {
child.stdin.end();
}
})
}
npmLogin()
// package.json 配置上即可
"scripts": {
"publish": "node ./npmlogin && npm publish"
}
这样一来发布包的时候再也不用手动登录了
|