文中
Webpack
版本为 5.x,Vite
版本为 4.3.x
webpack 是新一代构建工具里面的老大哥了,从 2013 年发布已经持续升级 10 年,形成完备的生态环境。vite 则是下一代前端开发与构建工具,2019年发布,最新发布版本 4.3.3(截至 23年4月底),性能能继续提升。
实际开发中我还是以 webpack 为主,还记得 2015 年刚刚开始接触时,一顿醍醐灌顶,原来前端也可以这样玩(思维定性了)。
# 安装最新版本的 vue-cli(5.x)
npm install -g @vue/cli
# 新建项目
vue create 项目名称
# VITE
npm create vue@3
两者的配置文件一般是webpack.config.js
(使用 vue-cli 创建的项目嵌套在vue.config.js
内)、vite.config.js
开发环境下非常重要的配置项,webpack 默认服务端口
8080
(跟 tomcat 的冲突哈哈)、vite 默认端口5173
# webpack
devServer: {
host:"0.0.0.0",
port: 3000,
proxy: "http://localhost:10086"
}
# vite
server: {
host:"0.0.0.0",
port: 3000,
proxy: {
"/proxy": "http://localhost:10086"
}
}
端口占用
当开发服务的端口被占用时,框架会非常人性化地自动顺延。
关于应用启动
启动命令
webpack 用的是 serve
,vite 则是dev
,开发人员可根据个人喜好进行修改。启动时间
不得不说 vite 真的是快如闪电(webpack 则需要一段编译的时间),而且新版还对首屏载入时间进行了优化(旧版加载首页时有明显的卡顿 )内存占用
在 windows 11 (64位)下 webpack、vite 在进入首页后内存占用分别为92MB
、43MB
,数值仅供参考。
CTRL+C退出
# VITE 下使用 CTRL+C 强制退出时,控制台会输出一条报错信息,目前未能找到解决方案(强迫症患者表示有点受不了
ELIFECYCLE Command failed with exit code 1.
其他
若我们需要在项目中使用预设的常量值(如版本号、服务地址、版权信息等),则可以使用构建工具提供的常量定义(define)
。比如定义常量_APPNAME_
:
import { name, dependencies, devDependencies } from "./package.json"
// WEBPACK
configureWebpack: config => {
config.plugins.push(
new webpack.DefinePlugin({
"_APPNAME_": JSON.stringify(name),
"_URL_": `"http://localhost:10086"`,
// 将项目生产依赖、开发依赖定义为常量,则可以在页面中展示(开源库常用做法)
"_APP_INFO_": JSON.stringify({ dependencies, ddevDependencies })
})
)
}
// VITE
define :{
//同上
}
注意事项
摘自 https://webpack.js.org/plugins/define-plugin/
函数方法
)typeof
调用项目中如何使用
console.debug(_APPNAME_)
if(_APPNAME_=="test") {}
// webpack 中可以通过 require 动态引入依赖,比如仅在特定环境下才启用 mock。
if(process.env.NODE_ENV == "test"){
window.isMock = true
require('./mock')
}
/**
* 在 VITE 下可以这么做
* 这个是我尝试过多种方法后较为便捷的方案,如果读者有更好的方式烦请告知
*/
if(process.env.NODE_ENV == "test"){
const mod = import.meta.glob("./mock/index.js")
await mod["./mock/index.js"]()
}
批量引入
假设在
modules
目录下存在 N 个 js 文件
/**
* 使用 WEBPACK
*/
const modules = require.context('./modules', true, /\.js$/)
modules.keys().forEach(key=>{
console.debug(key, modules(key).default)
})
/**
* VITE 下按照下方代码动态导入
* https://vitejs.cn/guide/features.html#glob-import
*/
const modules = import.meta.globEager('./modules/**/*.js')
Object.keys(modules).forEach((key) => {
console.debug(key, modules[key].default)
})
方式 | 首次打包耗时 | 二次打包耗时 | 平均耗时 | 体积 |
---|---|---|---|---|
WEBPACK | 12360ms | 9144ms | 10752ms | 1.31MB |
WEBPACK(开启缓存) | 9850ms | 1852ms | 5852ms | 1.31MB |
VITE | 9150ms | 8740ms | 8945ms | 1.27MB |
机器配置如下:
可以看到默认情况下 VITE 速度更优,随着项目规模增大表现更明显。WEBPACK 开启缓存后,首次打包速度没差别(产生了 66MB
的缓存文件),但后续打包速度得到大幅提升
此场景常见于将全部依赖打包成单个文件(复用库、后端程序等)
// webpack.config.js
module.exports = {
mode: 'production',
entry: './index.js',
target: 'node',
cache:{
type: 'filesystem'
}
}