18.5.3 只在某一端引入模块
有些模块只能在浏览器里运行,把它整体限制在客户端加载,比在模块内部到处加守卫更干净。
一、用 import.meta.env.SSR 做模块级守卫
let storage
// 只有在非 SSR(客户端)环境下才引入 ./storage.js 模块
if (!import.meta.env.SSR) {
storage = import('./storage.js')
}
export default {
// ...
}
通过
import.meta.env.SSR做的代码守卫,实现了特定环境下的模块加载:服务端构建时这段import()不会被执行,也就不会因为模块内部使用了平台 API 而报错。
注意区分两种写法:
import('./storage.js')是动态引入(返回值是 Promise),只在满足条件时执行;顶部的import是静态引入,会被打包并始终执行,无法用它做条件加载。
相关
- 18.5.4 避免交叉请求引起的状态污染:客户端独占的模块,在服务端也不能当作请求级状态来共享