vitepress 打包遇到windows为undefiend的问题

市面上针对vitepress的文章比较少,官方文档也不是很全,需要自行去源码里面找配置
当文档项目打包时因为引入的第三方组件库内部会用到windows,但vitepress打包的时候,会在node中执行(为了服务端渲染的场景),node中没有window
找了下文档,有两种解决思路, 特此记录


第一种方案: 使用ClientOnly组件(仅在客户端渲染其插槽组件使用)  但是不建议
<ClientOnly>
  <NonSSRFriendlyComponent />
</ClientOnly>

第二种方案: 使用vue混入,在mounted中动态导入,
// \docs\.vitepress\theme\index.js
export default {
  ...DefaultTheme,
  NotFound: () => "custom 404", // <- this is a Vue 3 functional component
  enhanceApp: async (ctx) => {
    let { app } = ctx;
    DefaultTheme.enhanceApp(ctx);
    app.mixin({
      async mounted() {
        //你自己的插件地址
        import('../../src/index.js').then(module => {
            Vue.use(module.default);
        })
      },
    });
  },
};

### 解决 VitePress 打包时与 `window` 对象相关的错误 当遇到 VitePress 构建过程中涉及 `window` 对象的错误时,通常是因为构建工具尝试在服务器端渲染期间访问仅存在于浏览器环境中的全局对象。这类问题可以通过多种方式解决。 #### 方法一:条件判断是否存在 `window` 通过检测当前执行环境中是否有 `window` 来防止未定义引用: ```javascript let myFunction = () => { if (typeof window !== 'undefined') { // 安全地操作 window 对象 console.log(window.innerWidth); } }; ``` 这种方法确保了只有在客户端加载页面之后才会尝试访问 `window`[^1]。 #### 方法二:延迟初始化依赖于 `window` 的代码 对于那些必须等到 DOM 加载完成才能运行的部分,可以考虑将其包裹在一个事件监听器内,比如 `DOMContentLoaded` 或者更简单的 `onload` 事件处理程序中: ```javascript document.addEventListener('DOMContentLoaded', function() { // 这里放置需要使用到 window 的逻辑 }); // 或者 window.onload = function(){ // 同样也可以在这里面安全调用 window 属性方法 } ``` 这能有效避免 SSR(服务端渲染)阶段触发此类异常情况的发生[^2]。 #### 方法三:配置 Vite 插件排除特定模块 如果某些第三方库默认会立即读取 `window` 并因此抛出错误,则可以在 vite.config.js 中设置 alias 和 externalize 配置项来绕过这个问题: ```javascript import { defineConfig } from 'vite'; export default defineConfig({ build: { rollupOptions: { external: ['some-third-party-library'], output: { globals: { 'some-third-party-library': 'SomeThirdPartyLibrary' }, }, }, }, }) ``` 此策略适用于已知哪些外部资源会在启动初期就试图接触 `window` 而造成冲突的情形下[^3]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值