Skip to content

Commit 6957a2a

Browse files
author
zhangdong
committed
Merge branch 'main' of https://github.com/dddssw/blog
2 parents 70aa114 + fe31b24 commit 6957a2a

File tree

4 files changed

+384
-56
lines changed

4 files changed

+384
-56
lines changed

bundle/vite/env.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
---
2+
layout: doc
3+
outline: deep
4+
---
5+
## 内置的环境变量
6+
Vite 在一个特殊的 import.meta.env 对象上暴露环境变量
7+
8+
https://vitejs.cn/vite3-cn/guide/env-and-mode.html#env-variables
9+
## 生产环境替换
10+
在引用它们时请使用完全静态的字符串。动态的 key 将无法生效
11+
12+
## .env 文件(配置)
13+
```js
14+
.env # 所有情况下都会加载
15+
.env.local # 所有情况下都会加载,但会被 git 忽略
16+
.env.[mode] # 只在指定模式下加载
17+
.env.[mode].local # 只在指定模式下加载,但会被 git 忽略
18+
```
19+
越具体优先级越高
20+
21+
另外,Vite 执行时已经存在的环境变量有最高的优先级,不会被 .env 类文件覆盖。例如当运行 VITE_SOME_KEY=123 vite build 的时候。
22+
23+
加载的环境变量也会通过 import.meta.env 以字符串形式暴露给客户端源码(以 VITE_ 为前缀的变量才会暴露)
24+
25+
## ts的智能提示
26+
https://vitejs.cn/vite3-cn/guide/env-and-mode.html#env-files
27+
28+
## 模式
29+
这是内置的development production
30+
```js
31+
/**
32+
* 'serve': during dev (`vite` command)
33+
* 'build': when building for production (`vite build` command)
34+
*/
35+
command: 'build' | 'serve';
36+
```
37+
这意味着当执行 vite build 时,它会自动加载 .env.production 中可能存在的环境变量
38+
```js
39+
# .env.production
40+
VITE_APP_TITLE=My App
41+
```
42+
如果我需要切换测试环境下的接口地址,它应该具有类似于development的行为,但环境变量与开发环境略有不同
43+
44+
--mode 选项标志来覆盖命令使用的默认模式,声明对应的.env.xx文件,这样就可以使用里面的配置了
45+
46+
[模式](https://vitejs.cn/vite3-cn/guide/env-and-mode.html#modes)
47+
48+
但是在 vite.config.ts 中通过 import.meta.env 是无法拿到任何数据
49+
50+
[你可以这样](https://vitejs.cn/vite3-cn/config/#async-config)
51+
52+
注意root 和 envDir 选项会影响加载行为
53+
54+
## envDir
55+
我们现在的.env文件都是建立在根目录的,如果.env.XX的文件太多,会显得我们的项目目录很乱,我们能将.env放在一个统一的文件夹
56+
```js
57+
import { defineConfig } from "vite";
58+
export default defineConfig( {
59+
envDir:"env"
60+
});
61+
```
62+
放在env这个文件夹即可

rust/trait.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
---
2+
outline: deep
3+
---
4+
trait TraitA {} 就定义了一个 trait,TraitA
5+
6+
这个标记被用在特定的地方,也就是类型参数的后面,用来限定(bound)这个类型参数可能的类型范围。所以 trait 往往是跟类型参数结合起来使用的。比如 T: TraitA 就是使用 TraitA 对类型参数 T 进行限制。也就是对泛型进行限制
7+
8+
我们怎么给某种具体的类型实现 TraitA,来让那个具体的类型可以代入 T 呢?具体来说,我们要对某个类型 Atype 实现某个 trait 的话,使用语法 impl TraitA for Atype {} 就可以做到
9+
10+
```rust
11+
trait TraitA {}
12+
struct Atype;
13+
impl TraitA for Atype {}
14+
```
15+
对于某个类型 T (这里指的是某种具体的类型)来说,如果它实现了这个 TraitA,我们就说这个类型满足约束.一个 trait 在一个类型上只能被实现一次
16+
17+
trait 对类型参数实施约束的同时,也对具体的类型提供了能力
18+
19+
在 trait 里可以定义关联函数,只是定义没有实现
20+
```rust
21+
trait Sport {
22+
fn play(&self); // 注意这里直接以分号结尾,表示函数签名
23+
fn play_mut(&mut self);
24+
fn play_own(self);
25+
fn play_some() -> Self;
26+
}
27+
```
28+
29+
在 trait 中可以使用 Rust 语言里的标准类型 Self,用来指代将要被实现这个 trait的那个类型。使用 impl 语法将一个 trait 实现到目标类型上去。
30+
```js
31+
struct Football;
32+
impl Sport for Football {
33+
fn play(&self) {} // 注意函数后面的花括号,表示实现
34+
fn play_mut(&mut self) {}
35+
fn play_own(self) {}
36+
fn play_some() -> Self { Self }
37+
}
38+
```
39+
40+
当然也可以在trait定义时默认实现
41+
```rust
42+
trait Sport {
43+
fn play(&self) {} // 注意这里一对花括号,就是trait的关联函数的默认实现
44+
fn play_mut(&mut self) {}
45+
fn play_own(self); // 注意这里是以分号结尾,就表示没有默认实现
46+
fn play_some() -> Self;
47+
}
48+
49+
//有了 trait 关联函数的默认实现后,具体类型在实现这个 trait 的时候,就可以“偷懒”,直接利用默认实现
50+
51+
struct Football;
52+
impl Sport for Football {
53+
fn play_own(self) {}
54+
fn play_some() -> Self { Self }
55+
}
56+
57+
//也可以覆盖默认实现
58+
```

0 commit comments

Comments
 (0)