File tree Expand file tree Collapse file tree 4 files changed +384
-56
lines changed
Expand file tree Collapse file tree 4 files changed +384
-56
lines changed Original file line number Diff line number Diff line change 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这个文件夹即可
Original file line number Diff line number Diff line change 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+ ```
You can’t perform that action at this time.
0 commit comments