美文网首页
lerna + vue3.0 中定义hooks包 无法触发视图更

lerna + vue3.0 中定义hooks包 无法触发视图更

作者: copyLeft | 来源:发表于2020-10-23 12:12 被阅读0次

    项目目录

    • root
      • apps
        • app-1
        • app-2
      • pkgs
        • utils
        • hook

    问题描述

    使用lerna 管理微前端项目时, 开发的独立工具包与项目依赖于同一vue版本, 工具包开发的hook工具,在项目中无法触发视图更新。

    源码

    // pkgs/hook/useToggle.js
    export function useToggle(initStatus?:any, reverseValue?:any){
      const state = ref(initStatus === undefined ? false : initStatus)
      const reverseValueOrigin = computed(() => { return reverseValue === undefined ? !initStatus : reverseValue })
    
    
      function toggle(value?:any){
        if(value !== undefined){
          state.value = value === initStatus ? reverseValueOrigin.value : initStatus
        }
        state.value = state.value === initStatus ? reverseValueOrigin.value : initStatus
      }
      
      const setLeft = () => { state.value = initStatus }
      const setRight = () => { state.value = reverseValueOrigin.value }
    
    
      return {
        state,
        toggle,
        setLeft,
        setRight
      }
    
    
    // app-1
    <template>
     {{ state }}
     <a-button @click='setLeft'> setLeft </a-button>
     <a-button @click='setRight'> setRight </a-button>
    </template>
    <script lang="ts">
    import { defineComponent } from 'vue'
    import { useToggle } from '@micro/hooks'
    
    
    export default defineComponent({
      setup(){
        const { state, setLeft, setRight } = useToggle('1', 0)
    
    
        return {
          state,
          setLeft,
          setRight
        }
      }
    });
    </script>
    

    问题原因

    尝试将app-1和hooks包的vue版本打印比较后,我们能发现,当前存在两个不同版本的vue包。 顺着app-1的node_modules, 可以发现两者的依赖问题。

    我们知道npm的node_modules依赖查询规则,遵守就近原则, 既先查询当前目录的node_modules, 未查到时,再查询父目录的node_modules,以此类推。

    使用lerna 安装本地包时,本地包是以链接的方式将依赖直接指向开发包目录。而开包包都需要安装本地依赖,由此本地包查询到的vue版本始终无法与项目依赖同步。

    所以造成了vue视图无法更新的问题。

    解决方案

    既然是依赖问题,那我们只要将依赖统一,问题自然就解决了。

    这里使用了 workspaces

    1. 配置 workspaces
    // 根目录lerna.json
    {
      "npmClient": "yarn",
      "useWorkspaces": true,
      ...
    }
    // 根目录
    "private": true,
     "workspaces": [
        "pkgs/*",  // 依赖包目录
        "demo/*",
        "eslint-config/*"
     ]
    
    1. 重构node_modules
    // 清空node_modules
    learn clean
    // 重新安装node_moduels
    learn bootstrap
    

    文档

    Lerna 中文教程详解

    相关文章

      网友评论

          本文标题:lerna + vue3.0 中定义hooks包 无法触发视图更

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