Q: Vue 有没有什么可以在无需引用就可挂载的全局对象?

2023-01-13 17:43:08 +08:00
 anonymous2351d00

intro

我有一堆自定义的配置比如

export function setupAuth(): void {
  const velon = useVelon();
  const store = new LocalStorageStore();
  const service = new TokenService(velon.conf!.auth!, store);
  velon.auth = { store, service };
}

再比如

export function setupHttp(): void {
  const velon = useVelon();
  velon.http = new HttpClient(velon.conf!, velon.auth!.service!);
}

诸如此类的一些对象,希望真正使用时可以通过如下方式调用

useVelon().http

目前 useVelon的实现方式为

export function useVelon(): Velon {
  // @ts-ignore
  if (window.velon) return window.velon;

  // @ts-ignore
  window.velon = reactive<VelonType>({});

  // @ts-ignore
  return window.velon;
}

try

尝试过使用如下方式

declare let velon

export function useVelon():Velon{....}

这样不好使

question

假如有一天我要把我的项目扔到electron或者其他没有window的地方去,这个全局唯一对象应该放在哪里?

1890 次点击
所在节点    Vue.js
14 条回复
thinkershare
2023-01-13 17:45:37 +08:00
globalThis 总是有的。
mxT52CRuqR6o5
2023-01-13 17:45:49 +08:00
globalThis
thinkershare
2023-01-13 17:47:32 +08:00
另外还是建议你按照 namspace 分离一下,模块化要解决的问题除了 namespace 还有按需加载和静态引用分析。
molvqingtai
2023-01-13 17:48:17 +08:00
挂载到 globalThis 或 vue.prototype 上,但是两者都不建议
anonymous2351d00
2023-01-13 17:50:41 +08:00
@thinkershare 受教了,感谢老哥。
anonymous2351d00
2023-01-13 17:52:46 +08:00
@thinkershare 另外还想请问,有没有什么分析 TS 代码引用关系的工具,可以帮助我来着手优化模块应用。
learningman
2023-01-13 18:09:53 +08:00
vue2 的话直接挂 vue 上
thinkershare
2023-01-13 18:20:34 +08:00
h0099
2023-01-13 20:45:50 +08:00
sjhhjx0122
2023-01-14 10:08:19 +08:00
vue 有依赖注入,直接用 provide 挂在全局,然后封装一下 inject 这样最起码还有类型,如果 provide ref 的话还是响应式的,react ,vue 的组件库的 globalConfig 都是用 provide 实现的
anonymous2351d00
2023-01-14 13:19:45 +08:00
@sjhhjx0122 nonono 这个不能用 provide ,想一下每次你要用 http

const http = unref(inject(HTTP_PROVIDE_KEY))
http.post()

每次都得声明
anonymous2351d00
2023-01-14 13:20:42 +08:00
@sjhhjx0122 而我这种方式
useVelon.http 或者直接抽成 const http = useHttp
sjhhjx0122
2023-01-14 14:48:34 +08:00
@anonymous2351d00 不需要啊 const http = unref(inject(HTTP_PROVIDE_KEY))
http.post()
为什么不直接封装成一个 hook 呢就跟你下面的一个效果了
JuzerQ
2023-01-15 18:58:21 +08:00
既然你调用时都是 useVelon ,没必要挂载在全局上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/908749

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX