Nodejs 项目 yarn 和 node 启动的区别
本文主要介绍 yarn 启动和 node 启动项目的区别,已经以实际项目中遇到的问题,来说明不同方式带来的影响
先说结论
使用 yarn 启动 Node.js 项目时,yarn 会将当前目录的 node_modules/.bin 子目录添加到 PATH 变量中。因此,在 yarn 启动的 shell 中,可以直接使用 node_modules 中安装的可执行程序命令,而无需指定完整路径。
而使用 node main.js 启动项目时,Node.js 不会自动添加 node_modules/.bin 子目录到 PATH 变量中。因此,在 node main.js 启动的 shell 中,无法直接使用 node_modules 中安装的可执行程序命令,需要指定完整路径。
或者在 node main.js 启动的 shell 中,手动添加 node_modules/.bin 子目录到 PATH 变量中。
所以建议使用 yarn run 命令启动项目,而不是 node main.js。
node_modules/.bin 目录的作用
Node.js 项目中 node_modules/.bin 目录的作用是存放 Node.js 项目中安装的依赖包中的可执行文件。
当我们使用 npm 或 yarn 命令安装一个依赖包时,如果该包的 package.json 配置文件中有 bin 字段,就会自动在我们项目中的 node_modules/.bin 目录生成指向依赖包 bin 字段的软连接(symlink)执行文件。
例如,我们安装了 eslint 依赖包,该包的 package.json 配置文件中有一个 bin 字段,如下所示:
当我们使用 yarn install 命令安装 eslint 依赖包时,就会在项目中的 node_modules/.bin 目录下生成一个名为 eslint 的执行文件,该文件是一个软连接,指向 eslint 依赖包中的 bin/eslint.js 文件。
因此,我们可以直接在 package.json 的 script 脚本中 eslint 命令来执行 eslint 依赖包中的 eslint.js 文件,而无需指定完整路径。
例如,我们可以使用以下命令来执行 lint 脚本:
该命令将使用 eslint 依赖包中的 eslint.js 文件来编译我们的项目。
另外,我们还可以使用 yarn 命令来执行 node_modules/.bin 目录下的可执行文件。例如,我们可以使用以下命令来使用 eslint:
需要注意的是,这种使用方式,eslint 后边要指定绝对路径,是什么原因,给大家留一个思考题。
看一下 node_modules/.bin 中的软连接(symlink)
项目实战
项目中使用了 Prisma cli(未全局安装)进行数据库 schme 的更新,并且在 package.json 中指定了 prisma 依赖
所以期望执行的命令为
在代码中的实现为
当通过 node 命令启动项目,调用 deploy 方法会遇到报错
使用 yarn start 启动项目,调用 deploy 方法,执行成功
以上,完结
版权声明: 本文为 InfoQ 作者【凯】的原创文章。
原文链接:【http://xie.infoq.cn/article/5bf2ef6f91225d7b5acf94526】。文章转载请联系作者。
评论