Nuxt + Typescript最佳实践5:使用yarn workspace管理多个项目

很多情况下我们可能有多个nuxtjs项目,多个项目之前有或多或少的关联,每个项目第一次启动项目都要安装一遍依赖,非常占用磁盘空间,那么可以不可以在一个文件夹下管理多个项目呢,这就是monorepo的概念。

很多流行的库都使用了monorepo的方式管理,比如vue, react



monorepo的管理方式可以使用lernayarn workspace, 这里说说yarn workspace管理多个nuxtjs项目,当然也可以管理其他的vue项目。

原理

nodejs项目引入外部依赖包,首先从本级目录查找,查找不到就到上级目录查找,直到系统根目录。

monorepo其实就是把各个项目里面的包,安装到根目录下,就是利用这个原理。但是如果包版本冲突呢?
举个例子:

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

系统会判定这两个没有冲突,因为根据语义化结果只需要安装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就会把低版本的包放到对应的子目录的node_modules里,高版本的放在根目的node_modules录,这样各自都能找到自己需要依赖的包了。

如何配置

如果我们的项目根目录是这样的

+-- common #基础包
+-- project1   #项目1
+-- project2   #项目2
+-- package.json

yarn worskspace 要求根目录的package.json,必须含有, 如何两个字段:

{
  "private": true,
  "workspaces": ["common", "project1", "project2"] // 也可以使用通配符设置为 ["project*"]
}

执行安装依赖(无论在根目录或者子目录执行)

yarn

安装之后我们可以看到都安装到了根目录的node_modules里面了。

那如果我们要执行子目录的命令怎么办?
两个办法:

  • 直接在子目录命令行里敲命令, 比如 yarn build
  • 直接在父目录命令行执行 比如 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里面引入本地包即可,版本号对应即可。
比如project1引入common, 将它的依赖加入dependencies字段即可:

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

project1的项目代码里即可引入了

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

*common项目要符合npm包的规范才可以正常使用。

需要注意的问题

1.node_modules 里的包移动后带来的问题。

很多原本安装在子项目node_modules的包被安装到了父目录了,而有些安装包并没有对monorepo进行适配, 所以编译会报错。

举几个例子:


  • postcss 编译报错
    在linux服务器编译postcss,说配置未找到。
    在根目录创建一份配置即可


  • 某些包编译配置依赖要改变。
    比如webpack-cdn-plugin插件
 plugins:[new WebpackCdnPlugin({
    modules: buildConfig.cdnConfig, // CDN配置
    pathToNodeModules: path.resolve(__dirname, './../')    // 指定查找的node_modules的目录,指向上级目录
})];


  • 多个项目的冲突。

你如你在project1 里面引入了element-ui。 nuxtjs项目的types文件夹扩展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项目,这个俩定义重复了就报错误,当然这并不影响运行结果。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335