写在前面:大家好K。首先为你点进这篇有趣的文章点赞👍!文章在撰写过程中难免有疏漏和错误,欢迎你在下方留言指出文章的不足之处;如果觉得这篇文章对你有用,也欢迎你点赞和留下你的评论。


文章目录

  • 1. node项目原始目录结构
  • 1.1 package.json文件
  • 1.2 package-lock.json文件
  • 2. 项目执行过程简要分析


1. node项目原始目录结构

.
├── XXX.js
├── node_modules
│   ├── express
│   │   └── XXX.XX
│   └── XXX
│       └── XXX.XX
├── package-lock.json
└── package.json

一个标准的node项目有这几个部分:

  1. XXX.js源代码文件:开发者主要写的代码文件;
  2. node_modules模块目录:里面存放了当前项目使用的模块文件;
  3. package.json项目配置文件:里面存放了项目的基本信息和配置信息;
  4. package-lock.json模块记忆文件:里面存放了所需要的模块包括依赖模块的详细信息,在二次安装时按照该此文件中所指版本和下载路径下载安装。

模块目录node_modules中个模块的结构和当前目录结构相同,因为每个模块都是一个node项目

1.1 package.json文件

使用npm init在空文件夹中即可创建该文件,此文件夹即为node项目根目录

文件内容示例:

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo 'Hello, world'"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}

里面有项目名称、版本号、描述、作者、遵循的协议类型等,这些字段为基本信息

协议的license文件,如果有,则放在项目根目录中。

  1. main字段

该键的值就是整个项目的起始文件名,整个项目从该文件启动。类似于html文件中的index.html

  1. script字段

阮一峰博客详细说明

因为是json文件,所以两边的键和值都用双引号包含(这里键名和值都是字符串)。

这些定义在package.json里面的脚本,就称为 npm 脚本,当在命令行输入npm 键名时,就会执行值的shell命令,如上示例:

# 输入
npm run test
# 实际执行的是test键对应的值
echo 'Hello, world'
# 所以输出 Hello, world

nestjs目录结构有什么好处 nodejs项目目录结构_nestjs目录结构有什么好处

当然值是shell命令,所以shell中所有操作都可以写在这里,如各种文件操作、服务操作等。且每次执行脚本,npm是新建子shell在里面执行,几乎不影响当前shell。

  • 当然可以弄一个键值对"start": XXX来执行启动时各种操作(需要安装run模块)。此时npm run start可缩写成npm start。如:
"start": "node ."

之后可以通过npm start启动项目。还有npm startnpm stopnpm restart

  • 在子shell启动时,npm会自动临时将node_modules/.bin加到环境变量中,所以可以通过文件名直接运行node_modules/.bin中的脚本。
  • 钩子。如果某键名是XXX,且还有键名preXXXpostXXX,当执行npm run XXX时,会按照npm run preXXX && npm run XXX && npm run XXX依次执行,如有三个键值对:
"preprint": "echo 'pre'",
"print": "echo 'ok'",
"postprint": "echo 'post'"

执行npm run print时会依次执行echo 'pre'echo 'ok'echo 'post'

  • 支持通配符。在写值的shell命令时,注意可能需要转义。
  • npm run多条命令连接时,如果希望当前一命令执行失败时立马停止,那么用&&连接多条命令。否则用单&连接。
  • 变量。以npm_package_开头,可以获取此文件package.json的各字段。如果在值的shell命令中使用,则加上$
"test": "echo $npm_package_main"

则执行npm run test时,会输出index.js

若想访问键中的键(嵌套),则继续用下划线_连接,如npm_package_dependencies_express的值为^4.17.1

  1. dependencies字段

这里只放了用到的第三方模块名和版本号,相对package-lock.json文件中的更简略。并未存放该模块所依赖的其他模块的信息。

格式为:

"模块名": "支持版本号"

支持版本号有三种表示,如:

  1. "~x.y.z",表示固定xy两个号码值,不低于z的版本。例~1.2.3表示,只能安装高于1.2.3(含)低于1.3.0(不含)的版本;
  2. ^x,y,x,表示固定x值,不低于y.z的版本。例^1.2.3表示,只能安装高于1.2.3(含)低于2.0.0(不含)的版本;
  3. latest:安装最新版本。

1.2 package-lock.json文件

使用npm安装时加上-S--save来自动创建、写入该文件。(新版的npm可不手动加此选项,默认自动保存)

例如第一次安装express模块是使用命令npm install -S express。因为express也有它自己的依赖,它的依赖又会有其他依赖(子子孙孙无穷尽也)。此时package-lock.json就会保存所有这些依赖的信息,如版本号、下载地址、校验码等。

优点:

  1. 固定版本号。如果不保存,当二次安装模块时,别的依赖包可能会更新,所以目的之一是固定依赖模块的版本号,减少版本引起的错误。
  2. 固定下载地址。第一次安装时是一层一层找依赖(依赖包的依赖包,子子孙孙无穷尽也)找下去安装的。这时找依赖的过程就会消耗大量的时间,该json文件保存了每个依赖包的下载地址,这样就能直接找到地址下载,提高了模块的安装速度。

2. 项目执行过程简要分析

主要分成两大部分三大步骤,前两步骤为项目的预操作,下载安装各模块和执行启动脚本。之后才是项目的主要部分。下面是简要过程:

  1. 当拿到一个node项目时,第一步先执行npm install安装需要的模块,此时就需要读取package.jsonpackage-lock.json里的内容,package-lock.json中存放了各依赖模块的下载地址信息和版本信息,可以帮助提高安装模块速度。
  2. 运行npm start启动项目,启动脚本的具体内容放在package.jsonscript字段中,然后重点读取package.json中的main字段信息,这里存放了项目起始的js脚本,整个项目从该文件开始执行。
  3. 项目各模块(node中每个文件即为一个模块)之间通过exportrequire等关键字以及共享数据进行沟通交互。