写点什么

Nodejs 项目 yarn 和 node 启动的区别

作者:
  • 2023-12-15
    上海
  • 本文字数:1392 字

    阅读完需:约 5 分钟

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 字段,如下所示:


{  "name": "eslint",  "version": "8.33.0",  "bin": {    "eslint": "./bin/eslint.js"  },  "main": "./lib/api.js",  ...}
复制代码


当我们使用 yarn install 命令安装 eslint 依赖包时,就会在项目中的 node_modules/.bin 目录下生成一个名为 eslint 的执行文件,该文件是一个软连接,指向 eslint 依赖包中的 bin/eslint.js 文件。


因此,我们可以直接在 package.json 的 script 脚本中 eslint 命令来执行 eslint 依赖包中的 eslint.js 文件,而无需指定完整路径。

{  "name": "my-project",  "scripts": {    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",  }}
复制代码


例如,我们可以使用以下命令来执行 lint 脚本:


yarn lint
复制代码


该命令将使用 eslint 依赖包中的 eslint.js 文件来编译我们的项目。


另外,我们还可以使用 yarn 命令来执行 node_modules/.bin 目录下的可执行文件。例如,我们可以使用以下命令来使用 eslint:


yarn eslint /absolute/path/to/project/{src,apps,libs,test}/**/*.ts --fix
复制代码


需要注意的是,这种使用方式,eslint 后边要指定绝对路径,是什么原因,给大家留一个思考题。

看一下 node_modules/.bin 中的软连接(symlink)


项目实战


项目中使用了 Prisma cli(未全局安装)进行数据库 schme 的更新,并且在 package.json 中指定了 prisma 依赖

所以期望执行的命令为

prisma migrate deploy
复制代码

在代码中的实现为

import { promisify } from 'node:util';import { exec } from 'node:child_process';
async deploy() { const execAsync = promisify(exec); const { stdout, stderr } = await execAsync( `prisma migrate deploy `, { env: { ...process.env, DATABASE_URL: 'real db connection string', }, }, );}
复制代码

当通过 node 命令启动项目,调用 deploy 方法会遇到报错

/bin/sh: 1: prisma: not found
复制代码

使用 yarn start 启动项目,调用 deploy 方法,执行成功

Environment variables loaded from .envPrisma schema loaded from db/schema.prisma
14 migrations found in prisma/migrations
No pending migrations to apply.
复制代码


以上,完结

发布于: 刚刚阅读数: 6
用户头像

关注

还未添加个人签名 2018-09-07 加入

还未添加个人简介

评论

发布
暂无评论
Nodejs项目yarn和node启动的区别_JavaScript_凯_InfoQ写作社区