写在前面:大家好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项目有这几个部分:
XXX.js
源代码文件:开发者主要写的代码文件;node_modules
模块目录:里面存放了当前项目使用的模块文件;package.json
项目配置文件:里面存放了项目的基本信息和配置信息;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文件,如果有,则放在项目根目录中。
-
main
字段
该键的值就是整个项目的起始文件名,整个项目从该文件启动。类似于html文件中的index.html
。
-
script
字段
阮一峰博客详细说明
因为是json文件,所以两边的键和值都用双引号包含(这里键名和值都是字符串)。
这些定义在package.json里面的脚本,就称为 npm 脚本,当在命令行输入npm 键名
时,就会执行值的shell命令,如上示例:
# 输入
npm run test
# 实际执行的是test键对应的值
echo 'Hello, world'
# 所以输出 Hello, world
当然值是shell命令,所以shell中所有操作都可以写在这里,如各种文件操作、服务操作等。且每次执行脚本,npm是新建子shell在里面执行,几乎不影响当前shell。
- 当然可以弄一个键值对
"start": XXX
来执行启动时各种操作(需要安装run模块)。此时npm run start
可缩写成npm start
。如:
"start": "node ."
之后可以通过npm start
启动项目。还有npm start
、npm stop
、npm restart
。
- 在子shell启动时,npm会自动临时将
node_modules/.bin
加到环境变量中,所以可以通过文件名直接运行node_modules/.bin
中的脚本。 - 钩子。如果某键名是
XXX
,且还有键名preXXX
或postXXX
,当执行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
-
dependencies
字段
这里只放了用到的第三方模块名和版本号,相对package-lock.json
文件中的更简略。并未存放该模块所依赖的其他模块的信息。
格式为:
"模块名": "支持版本号"
支持版本号
有三种表示,如:
"~x.y.z"
,表示固定x
,y
两个号码值,不低于z
的版本。例~1.2.3
表示,只能安装高于1.2.3
(含)低于1.3.0
(不含)的版本;^x,y,x
,表示固定x
值,不低于y.z
的版本。例^1.2.3
表示,只能安装高于1.2.3
(含)低于2.0.0
(不含)的版本;latest
:安装最新版本。
1.2 package-lock.json文件
使用npm
安装时加上-S
或--save
来自动创建、写入该文件。(新版的npm可不手动加此选项,默认自动保存)
例如第一次安装express
模块是使用命令npm install -S express
。因为express
也有它自己的依赖,它的依赖又会有其他依赖(子子孙孙无穷尽也)。此时package-lock.json
就会保存所有这些依赖的信息,如版本号、下载地址、校验码等。
优点:
- 固定版本号。如果不保存,当二次安装模块时,别的依赖包可能会更新,所以目的之一是固定依赖模块的版本号,减少版本引起的错误。
- 固定下载地址。第一次安装时是一层一层找依赖(依赖包的依赖包,子子孙孙无穷尽也)找下去安装的。这时找依赖的过程就会消耗大量的时间,该json文件保存了每个依赖包的下载地址,这样就能直接找到地址下载,提高了模块的安装速度。
2. 项目执行过程简要分析
主要分成两大部分三大步骤,前两步骤为项目的预操作,下载安装各模块和执行启动脚本。之后才是项目的主要部分。下面是简要过程:
- 当拿到一个node项目时,第一步先执行
npm install
安装需要的模块,此时就需要读取package.json
和package-lock.json
里的内容,package-lock.json
中存放了各依赖模块的下载地址信息和版本信息,可以帮助提高安装模块速度。 - 运行
npm start
启动项目,启动脚本的具体内容放在package.json
的script
字段中,然后重点读取package.json
中的main
字段信息,这里存放了项目起始的js脚本,整个项目从该文件开始执行。 - 项目各模块(node中每个文件即为一个模块)之间通过
export
、require
等关键字以及共享数据进行沟通交互。