Nuxt + Typescript最佳實踐5:使用yarn workspace管理多個項目

很多情況下我們可能有多個nuxtjs項目愤诱,多個項目之前有或多或少的關(guān)聯(lián)吁峻,每個項目第一次啟動項目都要安裝一遍依賴唐断,非常占用磁盤空間柑船,那么可以不可以在一個文件夾下管理多個項目呢佃延,這就是monorepo的概念现诀。

很多流行的庫都使用了monorepo的方式管理,比如vue, react履肃。



monorepo的管理方式可以使用lernayarn workspace, 這里說說yarn workspace管理多個nuxtjs項目,當(dāng)然也可以管理其他的vue項目仔沿。

原理

nodejs項目引入外部依賴包,首先從本級目錄查找尺棋,查找不到就到上級目錄查找封锉,直到系統(tǒng)根目錄。

monorepo其實就是把各個項目里面的包膘螟,安裝到根目錄下成福,就是利用這個原理。但是如果包版本沖突呢荆残?
舉個例子:

A 依賴了  C@^2.0.0
B 依賴了  C@^2.9.0

系統(tǒng)會判定這兩個沒有沖突奴艾,因為根據(jù)語義化結(jié)果只需要安裝C@2.9.0以上的版本就行。

但是如果:

A 依賴了  C@^1.0.0
B 依賴了  C@^2.9.0

那么A只能安裝C@1.x.x 的最高版本内斯,那么B只能安裝C@2.9.x 的最高版本蕴潦。
這就形成了沖突,yarn workspace就會把低版本的包放到對應(yīng)的子目錄的node_modules里俘闯,高版本的放在根目的node_modules錄潭苞,這樣各自都能找到自己需要依賴的包了。

如何配置

如果我們的項目根目錄是這樣的

+-- common #基礎(chǔ)包
+-- project1   #項目1
+-- project2   #項目2
+-- package.json

yarn worskspace 要求根目錄的package.json真朗,必須含有, 如何兩個字段:

{
  "private": true,
  "workspaces": ["common", "project1", "project2"] // 也可以使用通配符設(shè)置為 ["project*"]
}

執(zhí)行安裝依賴(無論在根目錄或者子目錄執(zhí)行)

yarn

安裝之后我們可以看到都安裝到了根目錄的node_modules里面了此疹。

那如果我們要執(zhí)行子目錄的命令怎么辦?
兩個辦法:

  • 直接在子目錄命令行里敲命令, 比如 yarn build
  • 直接在父目錄命令行執(zhí)行 比如 yarn workspace project1 build

一般來講我們可以把子目錄的各種命令放到根目錄

#根目錄下的  `package.json`, 加入腳本
"scripts": {
  "project1-build": "yarn workspace project1 build",
  "project1-dev": "yarn workspace project1  dev",
  "project2-build": "yarn workspace project2   build",
  "project2-dev": "yarn workspace project2   dev"
}

引入本地包

yarn workspace的包是可以相互引入的遮婶,引入方式也很簡單秀菱,在需要引入的子項目的package.json里面引入本地包即可,版本號對應(yīng)即可蹭睡。
比如project1引入common, 將它的依賴加入dependencies字段即可:

"dependencies": {
  "common": "^1.0.0"
}

project1的項目代碼里即可引入了

import * as common from 'common';
console.log(common):

*common項目要符合npm包的規(guī)范才可以正常使用衍菱。

需要注意的問題

1.node_modules 里的包移動后帶來的問題。

很多原本安裝在子項目node_modules的包被安裝到了父目錄了肩豁,而有些安裝包并沒有對monorepo進(jìn)行適配, 所以編譯會報錯脊串。

舉幾個例子:


  • postcss 編譯報錯
    在linux服務(wù)器編譯postcss辫呻,說配置未找到。
    在根目錄創(chuàng)建一份配置即可


  • 某些包編譯配置依賴要改變琼锋。
    比如webpack-cdn-plugin插件
 plugins:[new WebpackCdnPlugin({
    modules: buildConfig.cdnConfig, // CDN配置
    pathToNodeModules: path.resolve(__dirname, './../')    // 指定查找的node_modules的目錄放闺,指向上級目錄
})];


  • 多個項目的沖突。

你如你在project1 里面引入了element-ui缕坎。 nuxtjs項目的types文件夾擴(kuò)展vue定義

// node_modules\@nuxt\types\app  第119行
export interface NuxtApp extends Vue {
  /***給vue拓展了 $loading***/ 
  $loading: NuxtLoading
}

element-ui 也定義了

// node_modules\element-ui\types\loading.d.ts   59行
declare module 'vue/types/vue' {
  interface Vue {
    $loading (options: LoadingServiceOptions): ElLoadingComponent
  }
}

如果是TypeScript項目怖侦,這個倆定義重復(fù)了就報錯誤,當(dāng)然這并不影響運行結(jié)果谜叹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匾寝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子荷腊,更是在濱河造成了極大的恐慌艳悔,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件女仰,死亡現(xiàn)場離奇詭異猜年,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疾忍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門乔外,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人一罩,你說我怎么就攤上這事杨幼。” “怎么了擒抛?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵推汽,是天一觀的道長补疑。 經(jīng)常有香客問我歧沪,道長,這世上最難降的妖魔是什么莲组? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任诊胞,我火速辦了婚禮,結(jié)果婚禮上锹杈,老公的妹妹穿的比我還像新娘撵孤。我一直安慰自己,他們只是感情好竭望,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布邪码。 她就那樣靜靜地躺著,像睡著了一般咬清。 火紅的嫁衣襯著肌膚如雪闭专。 梳的紋絲不亂的頭發(fā)上奴潘,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音影钉,去河邊找鬼画髓。 笑死,一個胖子當(dāng)著我的面吹牛平委,可吹牛的內(nèi)容都是我干的奈虾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼廉赔,長吁一口氣:“原來是場噩夢啊……” “哼肉微!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起昂勉,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤浪册,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后岗照,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體村象,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年攒至,在試婚紗的時候發(fā)現(xiàn)自己被綠了厚者。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡迫吐,死狀恐怖库菲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情志膀,我是刑警寧澤熙宇,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站溉浙,受9級特大地震影響烫止,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戳稽,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一馆蠕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惊奇,春花似錦互躬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乓序,卻和暖如春寺酪,著一層夾襖步出監(jiān)牢的瞬間舟奠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工房维, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留沼瘫,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓咙俩,卻偏偏與公主長得像耿戚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阿趁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344