Vue3入门之Typescript

标签: 无 分类: 未分类 创建时间:2022-02-21 01:16:54 更新时间:2023-10-20 11:23:26

使用vite可以创建vue-ts模板

1.项目创建

使用pnpm可以方便的创建vue-ts的模板,选择vue,选择vue-ts即可。

1
2
## 根据要求选择vue-ts模板
pnpm create vite

2.修改typescript版本

在使用 vite 创建vue-ts的模板之后,什么代码都没有改

1
2
3
4
## 安装
pnpm install
## 运行
pnpm dev

安装运行之后,还是可以允许的,就是报错,打开vscode,出现了vscode报错的情况,一片一片的红,比如:Cannot find name ‘defineProps’

[解决]
最新版本可能没有这个问题了,遇到就按下面这么做好了,而且输入type,也没有了Volar这个选项了,不知道为什么,要是遇到了再说好了。
(1) 在VS code 中,按F1键,输入框中输入 “typescript: select Typescript version”

(2) 选择 workspace 下的 typescript 即可

为什么会出现这样的情况,暂时不清楚,反正就是这么解决了,要是报错,我就浑身难受,虽然不影响开发,但是就是想解决。

3.配置src别名

以前的vue的时候,经常用 @ 符号代替 src 目录,这样可以少些一些代码,也不用写相对路径了,这样更加的方便。主要有两步
(1) 增加 “allowSyntheticDefaultImports”:true
引入path路径的时候,需要在tsconfig.node.json中compilerOptions节点下添加:”allowSyntheticDefaultImports”:true。

有些参考文章是在tsconfig.json中的compilerOptions,我在这个文件中修改没有用。修改alias的别名(可以把tsconfig.node.json删除,把tsconfig.json中的 “references”: [{ “path”: “./tsconfig.node.json” }] 删除 )。

(2) 安装依赖

1
2
3
4
## 安装依赖
pnpm add @types/node -D
## or
npm install @types/node --save-dev

(3) 配置 vite.config.js 文件
编写 vite.config.js 文件,增加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

import path from 'path';

// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
}
},
})

这样做之后,虽然可以编译通过,但是vscode还是提示找不到模块。

(4) 修改 tsconfig.node.json 文件
我写了一个api模块,是一个js文件,但是在引入的时候,总是会报错找不到模块:Cannot find module ‘@/api/gas.js’ or its corresponding type declarations.。

【解决】
在tsconfig.json中添加如下的内容,增加@别名。注意,就是不能写成 “@”,需要带着后面的 “@/*”

1
2
3
4
5
6
7
8
"compilerOptions": {
// ++ 这里加上baseUrl 和 path即可 ++
"baseUrl": "./",
"paths": {
// 根据别名配置相关路径
"@/*": ["./src/*"]
}
}
参考文章:
1.ts文件中引入js模块 使用require引入js模块
2.为TypeScript引用的JS写声明文件 这里的内容还是挺多的,
3.ts中引入js文件以及使用全局js方法报错问题 无法找到模块“@/xxx/xxx”的声明文件。“xxx.js”隐式拥有 “any” 类型。const { encryptionJump,decryptJump } = require(“@/utils/rsa”)
4.深入理解 TypeScript
5.Show error “Cannot find module” although I have typings folder 这个讨论没看明白
6.vite+ts vscode无法识别别名路径 这个可以借鉴一下

5.开发环境和生产环境

vite在 import.meta.env 对象上暴露环境变量,替代了 process.env。.env.production用于生产环境,.env.development 用于生产环境。在.env文件中的以 VITE_开头的变量,可以在 import.meta.env 上使用。

参考文章:
1.Vue3+Vite+TypeScript多环境项目搭建 在根目录下创建 .env.dev文件和 .env.prod文件,分别代表开发、测试环境,文件内容如下,注意这里边的变量需要已VITE_开头。在package.json修改scripts里的dev命令为vite –force –mode dev,新建prod命令”prod”: “vite –mode prod”
2.环境变量和模式
3.vite+vue3+ts+vant搭建项目 1.babel.config.js文件需要对vant框架需做额外插件处理;2.ts配置时需要去除掉node_modules, 避免对依赖项进行校验,额外增加项目编译时间;3.项目引用路径的简写除了在webpack文件中需要配置,tsconfig.json也需要额外配置;4.在vite.config.js的plugins中处理vant框架的引入,在配置文件中还有对less的处理;5.vite-ssr服务配置

6.编写ts模块

router

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import { defineAsyncComponent } from 'vue';

const routes: Array<RouteRecordRaw> = [
{
path: '/',
redirect: '/home'
},
{
path: '/home',
name: 'home',
component: () => import('@/pages/home/index.vue')
}
]

const router = createRouter({
history: createWebHistory(),
routes
})

export default router

vuex

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { createStore } from 'vuex'

// 创建一个新的 store 实例
const store = createStore({
state () {
return {
token: null
}
},
mutations: {
increment (state:any) {
state.count++
}
}
});

export default store;

参考文章:
1.浅谈TypeScript的模块导入导出
2.vue3 + ts 初体验 包含了路由配置、组建创建,还有组件编写。在 vue-router4.0 中,提供了两种创建 history 的方式,分别是 createWebHistory 和 createWebHashHistory。由于采用了 typescript 编码,在定义 routes 常量时,需要声明类型为 Array
3.VSCode 中,TS 提示 ”无法找到 *.vue 声明文件“ 的解决方案

引入组件

在 script setup 中,引入的组件可以直接使用,无需再通过components进行注册,并且无法指定当前组件的名字,它会自动以文件名为主,也就是不用再写name属性了。而且需要将Vetur插件,换成Volar插件,这样就不会报找不到组件的问题了。

1
2
3
4
5
6
7
<template>
<HelloWorld />
</template>

<script setup>
import HelloWorld from "./components/HelloWorld.vue"; // 此处使用 Vetur 插件会报红
</script>
参考文章:
1.Vue3 script setup 语法糖详解 组件自动注册,组件核心 API 的使用,父子组件通信,定义响应变量、函数、监听、计算属性computed 等等内容。
2.vscode使用vue3 setup语法引入组件时波浪线问题 用Volar,再把之前的Vetur 禁用掉,波浪线解除

7.配置二级目录

路由模式使用了 history 模式,使用 nginx 进行转发,配置为二级目录,页面现实空白。比如我这里的二级目录为 test,主要解决方法包括下面几个步骤

(1) 配置vite.config.js中的 base 配置为 ”/test“,可以用 mode===’production’?’/test’:’’ 配置

1
2
3
4
5
6
7
8
9
export default defineConfig(({ mode, command }) => {
return {
// 部署生产环境和开发环境下的URL。
// 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
base: mode === 'production' ? '/test' : '/',
}
})

(2) 修改route中的history: createWebHistory(“/test”),可以用变量:import.meta.env.VITE_BASE_URL 替代,这里需要在.env.producation文件中定义 VITE_BASE_URL

1
2
3
4
5
6
let baseUrl=process.env.NODE_ENV == 'development' ?"/":"/test";
const router = new createRouter({
history:createWebHistory(baseUrl),
routes:[
]
})

(3) 配置nginx,指向二级目录

1
2
3
4
5
6
7
## 用汽申报
location ^~ /test {
alias /cloud/test/dist;
try_files $uri $uri/ /test/index.html;
index index.html;
}

8.配置局域网访问

在vite.config.js文件中添加server配置。

1
2
3
4
5
server: {
open: true,
host: '0.0.0.0',
port: 8080
},

9.引入js文件

10.在html中使用环境变量

我这里有一个使用高德地图密钥的配置,这里我想着在这个script的标签里面,使用环境变量,如果直接输出,就会出现 :Uncaught SyntaxError: import.meta may only appear in a module 错误。

1
2
3
4
5
6
7
8
9
10
11
12
<body>
<div id="app"></div>
<script>
console.log(import.meta.env.VITE_END_POINT);
</script>
<script type="text/javascript">
window._AMapSecurityConfig = {
serviceHost:'/_AMapService'
}
</script>
<script type="module" src="/src/main.ts"></script>
</body>

经过一番的折腾,我放弃了,直接写到了 模块的代码里面。

参考文章:
1.如何在 Vite 2.0 项目中导入环境变量
2.vite 使用 env 环境变量 这里安装了一个 vite-plugin-html 插件,但是我这里没有显示:模块“”vite-plugin-html””没有导出的成员“injectHtml”

11.script setup lang=”ts”

直接引入其他的组件,然后在模板中使用就可以了。

1
2
3
4
5
6
7
8
9
10
11
<template>
<Foo></Foo>
<foo-item></foo-item>
<component :is="Foo" />
<component :is="someCondition ? Foo : FooItem" />
</template>
<script setup lang="ts">
import Foo from "./Foo.vue"
import FooItem from "./FooItem.vue"
const someCondition = false
</script>

引入的组件会自动注册的。需要注意的是,使用动态组件的时候,应该使用动态的 :is 来绑定

1
2
3
4
5
6
7
8
9
<template>
<component :is="Foo" />
<component :is="someCondition ? Foo : FooItem" />
</template>
<script setup lang="ts">
import Foo from "./Foo.vue"
import FooItem from "./FooItem.vue"
const someCondition = false
</script>
参考文章:
1.Vue3中
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。