# vue3-vite
**Repository Path**: ak_h/vue3-vite
## Basic Information
- **Project Name**: vue3-vite
- **Description**: vite配置vue3开发环境 ,实际项目配置,vite.config.js; vue-router、vuex
- **Primary Language**: JavaScript
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2023-03-02
- **Last Updated**: 2023-03-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
vite + vue3
安装 vite 从 0 搭建 vue3 开发环境。
### 安装 `vite`
支持 vue 模板文件,支持`jsx`语法文件
```sh
npm install vite
```
> 安装 `@vitejs/plugin-vue-jsx ` `@vitejs/plugin-vue`
```js
// 类型提示
import { defineConfig } from 'vite'
import vueJSX from '@vitejs/plugin-vue-jsx'
import vueSFC from '@vitejs/plugin-vue'
// config
export default defineConfig(({ command, mode }) => {
/**
* command - 命令模式
* mode - 生产、开发模式
*/
return {
// 项目根目录,index.html 所在的目录
root: '',
// 生产或开发环境下的基础路径
base: '/',
// 需要用到的插件数组
plugins: [
// .vue 单文件组件
vueSFC(),
// .jsx 文件类型支持
vueJSX({
// ... @vue/babel-plugin-jsx 的配置
}),
],
// 静态资源服务目录地址
publicDir: '',
// 存储缓存文件的目录地址
cacheDir: '',
//
resolve: {
// 设置文件目录别名
alias: {
'@': '/src',
},
//
extensions: ['.js', '.jsx', '.vue'],
},
//
css: {
// postcss-modules 行为配置
modules: {
// ...
},
// 传递给css预处理器的配置项
preprocessorOptions: {
// 指定less预处理的配置项
less: {
// ...
},
},
},
// esbuild 选项转换配置
esbuild: {
// ...
// 在react组件中无需导入react
// jsxInject: `import React from 'react'`,
// vue 使用jsx
jsxFactory: 'h',
jsxFragment: 'Fragment',
},
// 静态资源处理
assetsInclude: '',
// 开发服务器选项
server: {
// ...
host: '127.0.0.1',
port: '8081',
// 项目启动后自动打开浏览器
open: true,
},
// 构建配置项
build: {
// ...
// 指定输出目录
outDir: './dist',
// 指定静态资源存放目录
assetsDir: '',
// 启用、禁用css代码拆分
cssCodeSplit: true,
// 构建是否生成source map文件
sourcemap: 'inline',
// rollup 配置打包项
rollupOptions: {
// ...
// input:"src/index.js"
},
// 构建目录自动清除
emptyOutDir: false,
},
// 依赖优化配置项
optimizeDeps: {
// 依赖构建入口
entries: '',
// 排除不需要构建的依赖项
exclude: [],
},
}
})
```
### 支持 vue 开发
#### 安装`@vitejs/plugin-vue`
SFC 单文件组件`.vue`
```vue
```
可查看示例`ElementPlus/index.vue`
#### 安装`@vitejs/plugin-vue-jsx`
支持 JSX 语法
```jsx
import { defineComponent } from 'vue'
export default defineComponent({
data() {
return {}
},
render() {
return <>>
},
})
```
### 安装 `vue-router`
### 安装 `vuex` , 改用了 `pinia`
项目中可同时存在,这是示例项目。在实际项目开发中,还需要确定一种,避免数据状态来源不明。造成的代码阅读困扰
```shell
npm install pinia
```
在每个模块中,按目录创建,不需要导入到全局 store 对象中。
在`setup` 或者 JSX 响应式模式中,使用
```js
import { uesSystemStore } from '@/store/system.js'
import { computed } from 'vue'
// ... other
export default defineComponent({
setup(props, context) {
// 获取到pinia的数据
const systemStore = uesSystemStore()
// 计算值
const name = computed(() => systemStore.systemName)
return {
name,
systemStore,
}
},
})
```
在传统的`.vue`模板中
```js
import { useTabStore } from '../../model'
export default {
data() {
// 此处可创建store实例
this.tabStore = useTabStore()
return {
// list data
data: [],
}
},
computed: {
activeTab() {
return this.tabStore.activeTab
},
},
}
```
### 安装 `element-plus`
全局配置
```js
// element
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import { zhCn } from 'element-plus/es/locale/index.js'
// ....
// element 国际化设置
app.use(ElementPlus, { size: 'small', zIndex: 3000, local: zhCn })
```
### 安装 `axios`
### 安装 `dayjs`
### markdown 支持
安装`markdown-it` `highlight.js`
使用: 代码是写在`setup`中的
```js
// markdown
import MarkdownIt from 'markdown-it'
import hljs from 'highlight.js'
// 将README.md导入进来
import ReadME from '/README.md?raw'
// 生命周期,挂载
onMounted(() => {
// 加载README.md
const md = new MarkdownIt({
html: false, // Enable HTML tags in source
xhtmlOut: false, // Use '/' to close single tags (
).
// This is only for full CommonMark compatibility.
breaks: false, // Convert '\n' in paragraphs into
langPrefix: 'language-', // CSS language prefix for fenced blocks. Can be
// useful for external highlighters.
linkify: false, // Autoconvert URL-like text to links
// Enable some language-neutral replacement + quotes beautification
// For the full list of replacements, see https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.js
typographer: false,
// Double + single quotes replacement pairs, when typographer enabled,
// and smartquotes on. Could be either a String or an Array.
//
// For example, you can use '«»„“' for Russian, '„“‚‘' for German,
// and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
quotes: '“”‘’',
highlight: (str, lang) => {
if (lang && hljs.getLanguage(lang)) {
try {
return (
'
' +
hljs.highlight(str, {
language: lang,
ignoreIllegals: true,
}).value +
'
'
)
} catch (__) {}
}
return (
'' + md.utils.escapeHtml(str) + '
'
)
},
})
// llink
md.linkify.set({ fuzzyEmail: false })
content.value = md.render(ReadME)
})
```
加载个样式,有很多可供挑选 在`import "highlight.js/styles/atom-one-dark.css"`
试了好几个,最后选择了这个,看着还不错。

#### 安装`markdown-it-anchor` 以便更好的导航
```sh
npm install markdown-it-anchor @sindresorhus/slugify
```
#### 安装`node-html-parser` 解析字符串为 html
```sh
npm install node-html-parser
```
### 安装`eslint\husky` 代码规范
代码规范;统一代码格式校验; (有一些配置还是有问题)
eslint 配置文件 `.eslintrc.js`
prettier 配置文件`.prettierrc.js`
#### `eslint` 代码格式校验
- `eslint-config-standard`
- `eslint-plugin-import`
- `eslint-plugin-node`
- `eslint-plugin-promise`
#### `prettier` 配合校验,格式化代码文件
vscode 安装`Prettier - Code formatter`, 设置配置;`format on save` and `formatter`
安装`eslint-config-prettier` 处理 eslint 和 prettier 之间的冲突;
支持`vue` 语法检测
`eslint-plugin-vue`
配置`.eslintrc.js`:
```js
module.exports = {
extends: ['standard', 'plugin:vue/vue3-recommended', 'prettier'],
}
```
#### `husky` git hooks 管理
安装
```sh
npm install husky --save-dev
```
在项目初始化时,需要执行`npm set-script prepare "husky install"`
初始化一个在 git commit 之前进行 eslint 的钩子。
```sh
npx husky add .husky/pre-commit "npm run lint"
//
git add .husky/pre-commit
```
#### lint-staged 检测缓存区的改动文件
```sh
npm install --save-dev lint-staged
```
修改 hook `pre-commit`
```
npm run lint-staged
```
### i18n 国际化配置
安装插件
```sh
//
npm i --save-dev vue-i18n
// vite 插件,暂时没有用到
npm i --save-dev @intlify/vite-plugin-vue-i18n
```
配置`index.js`
```js
// vue-i18n
import { createI18n } from 'vue-i18n'
// locale
import enLocale from './locals/en.json'
import cnLocale from './locals/cn.json'
// 4. 国际化配置
const i18n = createI18n({
locale: 'zh',
messages: {
en: {
...en,
...enLocale,
},
zh: {
...zhCn,
...cnLocale,
},
},
})
// 国际化
app.use(i18n)
```
### 文件预览,pdf、docx、pptx
除了 pdf,其他文件都是可编辑的,所以里面的内容可能会由于转换丢失样式等。计划想先把其他文件转成 pdf 然后在预览。
#### `.pdf`预览
安装`pdfjs-dist`
```sh
npm install pdfjs-dist --save
```
由于 vite 没有 require 模块,导致不能使用。在 issue 中找到了替代
重新安装,
```sh
# 支持es module
npm install @bundled-es-modules/pdfjs-dist
```
#### `.docx`预览
```sh
npm install mammoth
```
### Blog -系列文章
[vite-vue3 开发环境搭建](https://juejin.cn/post/7121174783407947783)
[Vue3 现在有多少种写法?](https://juejin.cn/post/7123482857632169997)
[vue3 sfc 单文件组件中如何书写 JSX 语法?](https://blog.csdn.net/heroboyluck/article/details/126057882?spm=1001.2014.3001.5501)
[vite 配置多页面应用](https://juejin.cn/post/7139101096810643492)
[pdf、markdown、docx 文件预览](https://blog.csdn.net/heroboyluck/article/details/127502521?spm=1001.2014.3001.5502)
### QA 问题记录
1. `$router.push()` 后,在点击`/` 跳转路由不对
2. 选择器,模糊匹配,比如`h1-h6` 可通过`h[1-6]`进行匹配
3. CSS 选择器附加父元素或上一个兄弟元素条件
4. 使用 a 标签进行导航 md 时,地址会映射到 hash 路由上
5. 使用 vs code 提交同步更改时,没有执行 git hooks