前言
年前为公司升级了新的monorepo项目架构,近来不用加班,在家得闲。便想再搭个monorepo项目,随便记录一下。
用到以下pnpm + vite3 + vue3 + ESLint + Stylelint + TypeScript
monorepe实战记录,此篇为其中一个的简单介绍。
vite是什么
vite是基于原生ES-Module的前端构建工具。
开发阶段:基于浏览器ESM加载模块,服务启动快。热更新快,只需让浏览器加载修改的模块。
生产打包:使用rollup进行打包
相较于webpack
先简单介绍下webapck
webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。它通过loader使之可以处理除JavaScript外的其他资源,并通过plugin系统扩展能力(包括压缩、资源分包等)。
它会从入口文件开始递归分析依赖并构建依赖关系图(对应着项目使用的模块),然后将这些的模块进行打包(一个包或多个包)。
webpack支持打包几乎所有的模块类型,比如ESModule、commonjs、AMD等。正因Webpack的功能大而全,它需要分析所有的模块然后打包,但这必然是消耗性能的(耗时),启动服务和热更新也都需要重新编译。当项目越来越大,消耗的时间也越长,每次启动项目和热更新都需要等待。
Vite是基于ESM加载模块,由浏览器接管部分打包程序的工作,只需要在浏览器请求源码时进行转换并提供源码。并使用由GO编写的esbuild(比JavaScipt打包预构建依赖快10-100倍)进行预购预构建。并且在热更新时,只需要让浏览器加载修改的文件而不用进行全量编译。简单来说,vite比webpack启动快,热更新快
。
虽然Vite比webpack有更好的发现体验,但不得不说webpack仍旧是一个非常强大的工具,webpack还有着成熟的生态环境。和其他打包工具一样(比如再之前Rollup),它们为我们提供良好的开发体验。它们有各自的优劣,我们要做的就是多了解它们,在不同的情况使用对应的工具,来为我们开发提供最大的便利。
文档使用的pnpm:快速的,节省磁盘空间的包管理工具。如不熟悉的推荐了解下。
尝鲜
初始化项目
创建一个项目文件夹(vite-test01)并初始化package.json文件
mkdir vite-test01 && cd vite-test01 && pnpm init
安装vite
pnpm add vite
按以下目录结构创建文件
index.html就是个简单的html文件,以type="module"形式导入src/index.js
src/index.js只是简单打印了下hello vite!
启动服务
执行npx vite
启动开发服务。也可将命令写入package.json scripts下,开发一般就是这样做的
"scripts": {
"dev": "vite"
...
}
然后执行pnpm run dev
很快项目便启动了,浏览器打开http://127.0.0.1:5173/
与webpack不同的,vite默认会在项目根目录查找vite.config.js
做为配置文件(可通过--config
指定配置文件,例如:vite --config my-config.js
),没有对应配置文件则以默认配置启动服务。
vite在开发阶段会基于项目根目录开启一个服务,此时vite相当于一个服务器。验证一下,在根目录新增test.html
看起来vite就像个静态服务器,但vite功能更加强大。比如vite会将index.html作为源码与模块图的一部分,并解析type="module"的script源码和 CSS<link href>
资源,...等
Vite通过解析并对请求做了特殊处理,比如将 ts 转译成 js (vite天然支持引入ts
)。
测试下对ts的支持。src下新建test.ts
文件,并在index.js中引入
// src/test.ts
console.log('use ts');
export const a: number = 111;
// src/index.js
import { a } from './test';
console.log('hello vite!');
console.log('test.a',a);
尝试直接使用vue
- 安装vue
pnpm add vue
- src新建
App.vue
<template> <div> Hello Vue! </div> </template> <script setup> </script> <style lang="scss" scoped></style>
- 修改src/index.js
import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount("#app");
当尝试直接使用其他类型的文件,编译报错。
和webpack类似,需安装对应的依赖并通过相应的配置使其支持更多文件类型。
配置选项
默认的配置对其他类型文件支持还是有限的,需要通过配置来增强其能力。
前面提到vite默认以项目根目录的vite.config.js做为配置文件(也可通过vite --config 配置文件
来指定) ,那么接下来创建个配置文件。
项目根目录下创建vite.config.js
import { defineConfig } from 'vite'
// https://vitejs.dev/config/
export default defineConfig({
// ...
})
需要注意的是
- vite的配置文件支持使用ESM语法,这样因为vite在配置文件加载前对其进行预处理。
defineConfig
是一个工具函数,为我们提供智能提示。也可以通过 IDE 和 jsdoc 的配合来实现智能提示,如下/** @type {import('vite').UserConfig} */ export default { // ... }
插件plugins
Vite可以使用插件来扩展能力。
配置插件
接下来通过插件使vite支持.vue文件。
安装pnpm add @vitejs/plugin-vue -D
前面vue尝鲜demo使用了scss,如写了样式,还需安装sass
pnpm add sass -D
,不用额外配置。
加入配置plugins中
import { defineConfig } from "vite";
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [
vue()
]
})
然后需重新启动项目,后浏览器打开。
🆗,这样就支持.vue文件了。
插件执行顺序
在某些时刻,我们需要调整插件执行顺序。
比如调整image插件的执行时机
import image from '@rollup/plugin-image';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [
{
...image(),
enforce: 'pre',
},
],
})
enforce有以下选项。
pre
:在 Vite 核心插件之前调用该插件- 默认:在 Vite 核心插件之后调用该插件
post
:在 Vite 构建插件之后调用该插件
开发选项 server
export default defineConfig({
// ...
server: {
open: true, // 是否自动打开浏览器,默认false
host: '0.0.0.0', // 监听ip,默认localhsot
port: 8081, // 指定服务器端口号,如被占用会尝试下一个可用端口号
proxy: { // 配置代理
'/api': { // 将 /api 开头的请求转发到 target 地址
target: 'http://www.xxx.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api, ''), // 重写地址
}
// ...
}
}
})
项目中这些是使用比较多的,更多的开发选项请查看官方文档-服务器选项
生产构建选项 build
export default defineConfig({
// ...
build: {
outDir: 'dist', // 相对于 项目根目录,指定输出路径,默认dist
assetsDir: 'assets', // 相对于 outDir,指定静态资源存放路径
ssr: false, // 是否服务端渲染,默认false
}
})
生产构建选项很多情况都不需要配置,使用默认值就行。更多的生产构建选项请查看官方文档-构建选项
预览选项 preview
从构建目录(/dist)启动web服务器,主要就是为了预览构建结果。配置选项很多和开发选项一致,可自行查看官方文档
未完待续
--------------------分割,上面内容未写完,下面内容待定--------------------
使用内置模板创建Vite项目
vite提供了一些内置模板,方便我们快速创建包含基本代码的vite项目。下面介绍通过npm、yarn、pnpm创建vite项目
-
npm:
npm init vite 项目名 [--template 模板预设]
等价于npx create-vite 项目名 [--template 模板预设]
-
yarn:
yarn create vite 项目名 [--template 模板预设]
等价于将以下两步
1,全局安装create-vite,或将已有的create-vite包更新到最新版本
2,使用create-vite指令构建项目: create-vite 项目名 [--template 模板预设] -
pnpm:
pnpm create vite 项目名 [--template 模板预设]
和npm init类似,相当于 使用create-vite创建vite项目
vite目前支持以下模板预设
JavaScript | TypeScript |
---|---|
vanilla | vanilla-ts |
vue | vue-ts |
react | react-ts |
preact | preact-ts |
lit | lit-ts |
svelte | svelte-ts |
使用vite创建一个 vue + ts 项目
pnpm create vite vite-vue3ts-demo --template vue-ts
跟着提示先把项目跑起来
1. cd vite-vue3ts-demo
2. pnpm install
3. pnpm run dev
目录结构如下,包含最基本的vue + ts的相关代码。