项目目录
- root
- apps
- app-1
- app-2
- pkgs
- utils
- hook
- apps
问题描述
使用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
- 配置 workspaces
// 根目录lerna.json
{
"npmClient": "yarn",
"useWorkspaces": true,
...
}
// 根目录
"private": true,
"workspaces": [
"pkgs/*", // 依赖包目录
"demo/*",
"eslint-config/*"
]
- 重构node_modules
// 清空node_modules
learn clean
// 重新安装node_moduels
learn bootstrap