亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue3.0中的monorepo管理模式的實(shí)現(xiàn)

 更新時(shí)間:2019年10月14日 09:56:58   作者:再來(lái)以后  
這篇文章主要介紹了Vue3.0中的monorepo管理模式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

前段時(shí)間9月21日參加了在成都舉辦的第五屆FEDAY, 印象比較深刻的是白鷺引擎首席架構(gòu)師@王澤分享的《框架開(kāi)發(fā)中的基礎(chǔ)設(shè)施搭建》 ,提到了在下一代白鷺引擎中使用到monorepo模式,以用來(lái)管理多個(gè)模塊,協(xié)調(diào)各個(gè)模塊之間的依賴更新。
正好在國(guó)慶期間10月5日尤大公開(kāi)了vue3.0已完成的源碼,也是采用了monorepo管理模式,看來(lái)monorepo確實(shí)有其獨(dú)到的優(yōu)勢(shì),再加上以前在項(xiàng)目中遇到過(guò)相關(guān)的痛點(diǎn),所以深入地了解了一下這種模式,本文將基于vue3.0討論如何通過(guò)monorepo模式來(lái)管理代碼的。

什么是 monorepo?

monorepo是一種將多個(gè)package放在一個(gè)repo中的代碼管理模式,摒棄了傳統(tǒng)的多個(gè)package多個(gè)repo的模式。

目前 Babel, React, Angular, Ember, Meteor, Jest等許多開(kāi)源項(xiàng)目都使用該種模式來(lái)管理代碼。

解決的問(wèn)題

  • 多個(gè)repo難以管理,編輯器需要打開(kāi)多個(gè)項(xiàng)目;
  • 某個(gè)模塊升級(jí),依賴改模塊的其他模塊需要手動(dòng)升級(jí),容易疏漏;
  • 公用的npm包重復(fù)安裝,占據(jù)大量硬盤容量,比如打包工具webpack會(huì)在每個(gè)項(xiàng)目中安裝一次;
  • 對(duì)新人友好,一句命令即可完成所有模塊的依賴安裝,且整個(gè)項(xiàng)目模塊不用到各個(gè)倉(cāng)庫(kù)去找;

帶來(lái)的問(wèn)題

  • 所有package代碼集中在一個(gè)項(xiàng)目,單個(gè)項(xiàng)目體積較大;
  • 所有package代碼對(duì)所有人可見(jiàn),無(wú)法做權(quán)限管理;

如何實(shí)現(xiàn) monorepo?

目前業(yè)界最佳實(shí)踐是采用yarn workspace + lerna 來(lái)實(shí)現(xiàn),vue3.0也是采用兩者結(jié)合的方式來(lái)實(shí)現(xiàn)。

yarn workspace可以實(shí)現(xiàn)在一個(gè)項(xiàng)目中實(shí)現(xiàn)多個(gè)模塊的依賴新增和共用,而lerna的功能則更完善,不僅可以管理多個(gè)模塊,還有清除模塊node_modules,發(fā)布模塊到npm,自動(dòng)更新模塊間版本依賴,并支持全量發(fā)布和根據(jù)改動(dòng)單獨(dú)發(fā)布等功能。

yarn官方推薦用yarn來(lái)處理依賴安裝,用lerna來(lái)處理依賴更新和發(fā)布問(wèn)題。

下面開(kāi)始基于monorepo模式來(lái)搭建一個(gè)仿vue3.0的項(xiàng)目

1. 全局安裝 yarn 和 lerna

$ npm i -g yarn lerna

2. 初始化項(xiàng)目

$ mkdir vue-next && cd vue-next 
$ lerna init

// 此時(shí)項(xiàng)目結(jié)構(gòu)
vue-next
|-packages
|-lerna.json
|-package.json

3. 添加yarn workspace配置

// vue-next/package.json
"private": true, // 項(xiàng)目根目錄下的private必須設(shè)置成true,否則workspace不會(huì)被啟用
"workspaces": [ // 指定需要管理的模塊
  "packages/*"
],

4. 添加模塊內(nèi)容

// 此時(shí)項(xiàng)目結(jié)構(gòu)
vue-next
|-packages     // packages下的所有包結(jié)構(gòu)類似,下面僅展示了compiler-core包的目錄結(jié)構(gòu)
  |-compiler-core   // 與平臺(tái)無(wú)關(guān)的編譯器
    |-__tests__     // 測(cè)試用例
    |-src        // 源文件
    |-index.js     // 根文件
    |-package.json   // 包配置
  |-compiler-dom   // 與瀏覽器相關(guān)的編譯器
  |-reactivity    // 數(shù)據(jù)響應(yīng)式系統(tǒng)
  |-runtime-core   // 與平臺(tái)無(wú)關(guān)的runtime
  |-runtime-dom    // 與瀏覽器相關(guān)的runtime
  |-runtime-test   // 為了測(cè)試的輕量級(jí)runtime
  |-server-renderer  // 服務(wù)端渲染
  |-shared      // 內(nèi)部幫助方法
  |-template-explorer // 預(yù)覽模版轉(zhuǎn)化成render函數(shù)的工具
  |-vue        // 用于構(gòu)建完整的vue版本

|-lerna.json
|-package.json

5. 安裝相關(guān)依賴

項(xiàng)目中一般只會(huì)用到以下3種安裝形式

5.1 給根項(xiàng)目安裝依賴(一般是公用的開(kāi)發(fā)工具)

// yarn 使用 workspace 模式安裝 npm 包時(shí)必須加 -W 參數(shù)
$ yarn add -W -D rollup typescript jest prettier ...

5.2 給package安裝外部npm包

// @vue/compiler-core 是取 vue-next/packages/compiler-core/package.json 的 name 字段
$ yarn workspace @vue/compiler-core add acorn estree-walker source-map 
$ yarn workspace @vue/template-explorer add monaco-editor 

5.3 給package安裝內(nèi)部npm包

// @vue/compiler-core 是取 vue-next/packages/compiler-core/package.json 的 name 字段
$ yarn workspace @vue/compiler-dom add @vue/compiler-core@3.0.0-alpha.1 // 一定要指定正確的版本號(hào),不然會(huì)到npm查找包
$ yarn workspace @vue/runtime-core add @vue/reactivity@3.0.0-alpha.1 
$ yarn workspace @vue/runtime-dom add @vue/runtime-core@3.0.0-alpha.1 
$ yarn workspace @vue/runtime-test add @vue/runtime-core@3.0.0-alpha.1 
$ yarn workspace vue add @vue/compiler-dom@3.0.0-alpha.1 @vue/runtime-dom@3.0.0-alpha.1 // 可同時(shí)安裝多個(gè)

至此已經(jīng)完成了項(xiàng)目的基礎(chǔ)搭建(打包等工程化內(nèi)容略過(guò),本文主要介紹monorepo相關(guān)),似乎主要是yarn在工作,lerna沒(méi)有沒(méi)有派上用場(chǎng),下面來(lái)介紹lerna在哪些地方可以賦能vue3.0。

lerna介紹

A tool for managing JavaScript projects with multiple packages.

一個(gè)在js項(xiàng)目中用來(lái)管理多個(gè)package的工具。

主要是便于開(kāi)發(fā)者更加高效簡(jiǎn)便地管理package本身,依賴,發(fā)布。

1. 初始化項(xiàng)目

// 生成基本項(xiàng)目結(jié)構(gòu)和 lerna 配置
$ lerna init  

2. 安裝依賴

如果需要重新安裝依賴,切記在刪除項(xiàng)目根路徑的node_modules前進(jìn)行g(shù)it提交保存,因?yàn)閙onorepo模式是以軟鏈接的形式來(lái)實(shí)現(xiàn)內(nèi)部 package 引用的,直接刪除整個(gè)node_modules的同時(shí)會(huì)把所有package的文件刪掉,難以恢復(fù)!

建議永不進(jìn)行刪除整個(gè)node_modules的操作,可以進(jìn)入node_modules全選后再取消勾選內(nèi)部package軟鏈接再刪除。

// 給所有 package 安裝依賴,在對(duì)于的目錄生成 node_modules,并在 node_modules 中為內(nèi)部package生成軟鏈接
$ lerna bootstrap
// 默認(rèn)會(huì)使用 npm 安裝,但是本項(xiàng)目使用 yarn,可以指定使用 yarn
$ lerna bootstrap --npm-client=yarn   // 或者在 lerna.json 配置 {"npmClient": "yarn"}
// 上述安裝方式如果不同package之間安裝了同一個(gè)npm包,會(huì)造成重復(fù)安裝,增加安裝時(shí)間和項(xiàng)目體積
// 可以利用 node_modules 向上查找的特性,將所有依賴安裝到項(xiàng)目根路徑的 node_modules 中,lerna 加上 --hosit即可
$ lerna bootstrap --hosit
// 使用lerna bootstrap --npm-client=yarn --hoist
// 會(huì)有沖突,報(bào)錯(cuò)--hoist is not supported with --npm-client=yarn, use yarn workspaces instead
------------------------------------------------
$ yarn // 推薦??! 用 yarn workspace 特性替代 lerna bootstrap

3. 清除pacakge中多余的node_modules

// 在 6.2 安裝依賴時(shí),部分npm包會(huì)給當(dāng)前的package目錄安裝 node_modules
// 同時(shí)根路徑中的 node_modules 也會(huì)安裝項(xiàng)目
$ lerna clean

4. 查看所有pacakge

// package.json 中設(shè)置了 "private": true 的 package 不會(huì)展示
$ lerna ls

5. 查看有改動(dòng)的pacakge

// package.json 中設(shè)置了 "private": true 的 package 不會(huì)展示
// 在 Independent mode 下只有改動(dòng)過(guò)的 package 才會(huì)被發(fā)布
// vue3.0 采用的是 Fixed/Locked mode (default),每次都會(huì)發(fā)布所有 package,package 版本跟隨項(xiàng)目的版本走
$ lerna changed

6. 推送到git和發(fā)布到npm(重要)

// 根據(jù)當(dāng)前的 lerna 模式(Fixed/Locked mode (default) 或者 Independent mode)來(lái)進(jìn)行整包發(fā)布或者有改動(dòng)的 package 單獨(dú)發(fā)布
// 每次發(fā)布會(huì)自動(dòng)更新相關(guān)package的版本號(hào),并且會(huì)更新引用該package的其他package依賴
$ lerna publish   

monorepo demo 鏈接

總結(jié)

本文介紹了vue3.0中monorepo管理模式的實(shí)現(xiàn),通過(guò)yarn workspace和lerna兩者相結(jié)合,達(dá)到了在一個(gè)repo 中高效便捷地管理多個(gè)package的目的。

在我們?nèi)粘9ぷ髦锌赡軟](méi)有開(kāi)發(fā)白鷺引擎,vue這類大型框架的需求,但是這不代表我們用不到該模式,下面我總結(jié)了幾種適合monorepo管理模式的場(chǎng)景:

  1. 大型框架,依賴自身開(kāi)發(fā)的多個(gè)獨(dú)立底層模塊支撐;
  2. 后臺(tái)項(xiàng)目,技術(shù)棧統(tǒng)一的多個(gè)后臺(tái)系統(tǒng),每個(gè)系統(tǒng)作為獨(dú)立的package單獨(dú)開(kāi)發(fā),優(yōu)化開(kāi)發(fā)和打包時(shí)間,同時(shí)共用的組件和js方法可以作為一個(gè)package;
  3. ui組件庫(kù),各個(gè)組件之間獨(dú)立實(shí)現(xiàn)按需加載,例如餓了么的移動(dòng)端組件庫(kù)mint-ui;
  4. sdk,接入同一sdk的不同渠道代碼統(tǒng)一管理;
  5. ...

參考資料

框架開(kāi)發(fā)中的基礎(chǔ)設(shè)施搭建
Vue 3 源碼導(dǎo)讀
基于lerna和yarn workspace的monorepo工作流

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue 文件目錄結(jié)構(gòu)詳解

    vue 文件目錄結(jié)構(gòu)詳解

    本篇文章主要介紹了vue 文件目錄結(jié)構(gòu)詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • vuex?設(shè)計(jì)思路和實(shí)現(xiàn)方式

    vuex?設(shè)計(jì)思路和實(shí)現(xiàn)方式

    這篇文章主要介紹了vuex?設(shè)計(jì)思路和實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue element-ui el-tooltip組件失效問(wèn)題及解決

    vue element-ui el-tooltip組件失效問(wèn)題及解決

    這篇文章主要介紹了vue element-ui el-tooltip組件失效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue如何使用watch監(jiān)聽(tīng)指定數(shù)據(jù)的變化

    vue如何使用watch監(jiān)聽(tīng)指定數(shù)據(jù)的變化

    這篇文章主要介紹了vue如何使用watch監(jiān)聽(tīng)指定數(shù)據(jù)的變化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • van-dialog 組件調(diào)用報(bào)錯(cuò)的解決

    van-dialog 組件調(diào)用報(bào)錯(cuò)的解決

    這篇文章主要介紹了van-dialog 組件調(diào)用報(bào)錯(cuò)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 用electron 打包發(fā)布集成vue2.0項(xiàng)目的操作過(guò)程

    用electron 打包發(fā)布集成vue2.0項(xiàng)目的操作過(guò)程

    這篇文章主要介紹了用electron 打包發(fā)布集成vue2.0項(xiàng)目的操作步驟,把electron 加入到自己項(xiàng)目中各種不兼容,升級(jí)版本踩坑無(wú)數(shù)個(gè),今天通過(guò)本文給大家分享下詳細(xì)過(guò)程,需要的朋友可以參考下
    2022-10-10
  • vue中動(dòng)態(tài)渲染數(shù)據(jù)時(shí)使用$refs無(wú)效的解決

    vue中動(dòng)態(tài)渲染數(shù)據(jù)時(shí)使用$refs無(wú)效的解決

    這篇文章主要介紹了vue中動(dòng)態(tài)渲染數(shù)據(jù)時(shí)使用$refs無(wú)效的解決方案,具有很好的參考價(jià)值。希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • VUE項(xiàng)目中封裝Echart折線圖的方法

    VUE項(xiàng)目中封裝Echart折線圖的方法

    這篇文章主要為大家詳細(xì)介紹了VUE項(xiàng)目中封裝Echart折線圖的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue手寫(xiě)實(shí)現(xiàn)異步更新詳解

    Vue手寫(xiě)實(shí)現(xiàn)異步更新詳解

    這篇文章主要介紹了Vue手寫(xiě)實(shí)現(xiàn)異步更新詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-08-08
  • vant框架van-cell插槽無(wú)法換行問(wèn)題及解決

    vant框架van-cell插槽無(wú)法換行問(wèn)題及解決

    這篇文章主要介紹了vant框架van-cell插槽無(wú)法換行問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論