当前位置: 首页 > 后端技术 > Node.js

升级Yarn2并摆脱node_modules

时间:2023-04-03 20:10:13 Node.js

最臭名昭著的节点项目是node_modules文件夹。这种糟糕的结构很容易让你的文件数量增加几万甚至几十万。不管是安装还是删除,都会消耗大量的时间,占用大量的inode节点,我们随便进入一个react项目文件夹,看看你的项目中有多少文件会因为node_modules:$find.-类型f|wc-l223629只是一个项目下面就有22万个文件之多。现在我们来看一下yarn当前的版本号:$yarn--version1.22.11那么,yarn当前的版本号是1.22.11,那我们怎么安装yarn2呢?答案是不需要安装,设置即可。$yarnsetversionberry设置好后,我们看一下yarn的版本号:$yarn--version3.0.0不是同意升级到yarn2了吗?怎么变成3.0了?不用恐慌,越高越好。然后我们再看一下项目文件夹中的几个文件。首先,根目录下多了一个.yarnrc.yml。里面只有一句话:yarnPath:.yarn/releases/yarn-berry.cjs对应的,还有一个文件夹.yarn,里面有一个子文件夹releases,里面有一个yarn-berry.cjs文件。这些文件都是yarn2添加的内容,不要忽略.gitignore中的这些内容。其他需要忽略的内容,现在在.gitignore中添加一些需要忽略的内容:/node_modules/.pnp.pnp.js.pnp.cjs.yarn/cache.yarn/unplugged.yarn/install-state.gz下,我们将使用新版本的yarn安装我们的依赖文件。在此之前,我们需要设置yarn库的镜像服务器来加快整个下载过程:在项目根目录的yml文件中,你会发现多了一行:npmRegistryServer:'https://registry.npm.taobao.org'yarnPath:.yarn/releases/yarn-berry.cjs所以我们知道这个yarnconfig命令没有什么特别的,只是用来修改.yarnrc.yml文件,也可以直接修改.yarnrc.yml文件达到同样的效果。现在,我们开始删除旧的node_modules文件夹和yarn.lock文件,重建整个项目:$rm-rfnode_modules$rm-fyarn.lock$yarn整个下载过程应该比较顺利,我们来看看项目文件文件夹里有什么文件:.yarn/cache.yarn/unplugged.pnp没有node_modules文件夹,我们看看.yarn/cache文件夹里有什么,里面有我们依赖的node_modules文件夹下的所有东西onbefore依赖包,但它不再以目录的形式存在,而是变成了一个zip文件。Yarn2使用项目根目录下的.pnp.cjs文件来定位这些zip文件来替换node_modules。大大减少了项目中的文件数量。接下来开始项目:yarnstart这个时候你的项目十有八九不会启动,别慌,这篇文章告诉你所有的解决方法。首先,你可能会遇到这样的错误:Error:Yourapplicationtriedtoaccessterser-webpack-plugin,butitisn'tdeclaredinyourdependencies;这使得require调用变得模棱两可且不合理。具体的内容可能不一样,但是你要注意关键字Yourapplication,意思是你的代码某处引用了后面的插件,但是你并没有在package.json文件中显式声明,所以为什么没有你以前用过yarn1或npm吗?这个问题怎么办?因为之前有一个node_modules文件夹,所有的依赖包都平铺在这个文件夹里,即使被其他依赖引入,也会在node_modules的根目录下释放,这样node就很容易找到了,现在文件夹不见了,我们必须在package.json文件中明确引用它来引导yarn找到这个依赖项。因此,解决你的应用程序缺少某种依赖的问题很简单。我们只需要用yarn安装即可:yarnadd-Dterser-webpack-plugin哦,又报错了:Invalidoptionsobject。Terser插件已使用与API模式不匹配的选项对象进行了初始化。这是因为我们在安装的时候没有指定版本,导致安装的插件版本过高。我们在package.json:"terser-webpack-plugin":"^4.2.3"中调低了版本,然后重新执行yarn安装,再次运行yarnstart启动,终于启动了!然而,不要高兴得太早,遇到了这样的问题:这使得require调用变得模棱两可且不合理。不要惊慌,既然你的应用还缺少某个依赖包,那仍然是我们的问题,停止并安装它,然后重新启动,直到你的应用引起的所有问题都解决为止。这时又出现了新的错误:Modulenotfound:rc-bmaptriedtoaccessbabel-runtime,butitisn'tdeclaredinitsdependencies;这使得require调用变得模棱两可且不合理。虽然同样没有找到依赖,但是这次的错误不是我们自己的应用导致的,而是依赖本身造成的。如何解决这个问题呢?别着急,我们打开.yarnrc.yml文件,根据报错信息添加如下设置:packageExtensions:'rc-bmap@*':dependencies:'babel-runtime':'*'我们随便添加缺少,有时我们需要注意版本号。还是那句话,这个问题不是yarn2引起的,而是因为我们的依赖中应该添加的依赖没有增加。我们这里只是为它完成依赖,让它可以正常运行。别忘了,每次修改.yarnrc.yml,都需要重新执行yarn,然后再执行yarnstart。至此,我们的项目终于可以运行成功了!让我们看一下当前项目文件夹中的文件数:$find。-类型f|wc-l17433现在只有17000个文件,比我们最初的22万个文件少了20万多,运行速度也成倍了。怎么样,值得一试吗?