美文网首页
import() 动态加载模块,使用记录

import() 动态加载模块,使用记录

作者: 前端早晚自习 | 来源:发表于2023-11-28 21:23 被阅读0次

    需求背景: 项目重构差不多了, 需要在部分路由中加个登录埋点。但问题来了, 因为这个登录是写在router.beforeEach 中的,埋点需要页面中的配置数据 思来想去试了好几种方法没有完美解决, 各位看官有更好的方法,多多交流

    思路一

    是在路由beforeEach 钩子中在 即将跳转的时候通知我可以访问到页面了

    • 用了eventBus 来发送通知
     router.beforeEach(async (to, from) => {
      try {
        const phone = await getAppUserInfo(to)
        await userStore.phoneLogin(params)
        emitter.emit('triggerAutoLogin','success') // 抛出登录成功事件
        return true
    })
    }catch (error) {}
    
    // 页面中监听
    <script lang="ts" setup>
    emitter.on('triggerAutoLogin',()={
        
    })
    </script>
    
    

    结果: 初始化不会执行, 路由变化的时候回执行。 感觉像是第一次没注册进来的样子~~

    • nextTick 和 setTimeout
     router.beforeEach(async (to, from) => {
      try {
        const phone = await getAppUserInfo(to)
        await userStore.phoneLogin(params)
    setTimeout(() => {
            emitter.emit('triggerAutoLogin','success') // 抛出登录成功事件
    }, 0);
    
        return true
    })
    }catch (error) {}
    
    // 页面中监听
    <script lang="ts" setup>
    emitter.on('triggerAutoLogin',()={
        
    })
    </script>
    
    

    结果: 初始化不会执行, 路由变化的时候回执行。如果定时器的延迟时间不能确定, 放到下一个事件循环里也没用~

    • router 打标记,埋点成功后删除

    我想了这种方式, 记在window也行, 虽然能解决 但没用

    思路二

    我又想了下, 不就是获取每个页面中的配置数据吗, 配置文件是单独的, 只要根据url动态获取数据不久行了, 如果以后要获取组件数据的话也可以改造。 于是就想到了import

    ES2020提案 引入import()函数,支持动态加载模块

    import()返回一个 Promise 对象。下面是一个例子。

    const main = document.querySelector('main');
    
    import(`./section-modules/${someVariable}.js`)
      .then(module => {
        module.loadPageInto(main);
      })
      .catch(err => {
        main.textContent = err.message;
      });
    
    
    • 使用 import 埋点
     router.beforeEach(async (to, from) => {
      try {
        const phone = await getAppUserInfo(to)
        await userStore.phoneLogin(params)
         triggerAutoLogin(to, 'success', { phone }) // 抛出登录成功事件
        return true
    })
    }catch (error) {}
    
    // report.ts
     *
     * @param name {string} 页面名称, 文件夹名称 love 等
     * @param type {string} 是否登录成功 success error
     * @param res 数据
     */
    export const triggerAutoLogin = async (to, type, res) => {
      const module = await import(/* @vite-ignore */ `/src/views/Special/pages/${name}/config`)
      const preData = module[dataType]
    }
    
    

    最后

    如果有什么错误,欢迎指正~

    相关文章

      网友评论

          本文标题:import() 动态加载模块,使用记录

          本文链接:https://www.haomeiwen.com/subject/nhjxgdtx.html