node_modules文件夹的问题
1. 文件夹以及文件过多过碎,当我们将项目整体拷贝给别人的时候,传输速度会很慢很慢。
解决方法:传递项目时不传递node_modules这个文件夹。
2. 复杂的模块依赖关系需要被记录,确保模块的版本和当前保持一致,否则会导致当前项目运行报错。
实际上,我们在传输项目的过程中是不需要传递node_modules这个文件夹的。npm这个工具为我们提供了一个项目描述文件 —— package.json文件。在这个文件中会记录项目依赖了哪些第三方模块, 当别人拿到这个项目时,会根据package.json文件中所记录的依赖项去下载第三方模块。这样项目在别人的电脑上就可以运行了。
package.json文件的作用
项目描述文件,记录了当前项目信息,例如项目名称、版本、作者、github地址、当前项目依赖了哪些第三方模块等。
使用npm init 命令可以快速生成package.json文件。默认情况下,这个命令会询问一些事情,比如项目的名称是什么、项目的版本是多少,如果不想填写可以使用默认值。
使用npm init -y 命令生成package.json文件,-y这个参数的意思是不填写任何信息,全部使用默认值。//package.json //npm init -y默认生成{//项目名称
"name":"description", 项目版本 "version":"1.0.0", //项目描述,通过此选项,可以让别人快速了解当前项目的功能及作用。 "description":"", //项目的主入口文件 "main":"index.js", //存储着命令的别名,当要执行的命令比较长的时候, //每一次在命令行工具中输入的时候都会比较麻烦 //可以在scripts中给较长的命令起一个别名, //执行这个较长的命令时使用别名来执行这个命令就可以了。使用. npm run 别名(build) 命令替代较长的命令 "scripts":{ "test":"echo\""Error: no test specified\"&&exit 1"
"bulid":"nodemon app.js"
}, //关键字,允许使用关键字来描述当前的项目 "keywords":[], //项目的作者 "author":"", //项目遵循的协议,默认是ISC协议(开放源代码协议) "license":"ISC" //下载formidable和mime这两个模块之后, // 在package.json这个文件中多了一个dependencies选项 , //并且记录了安装好的模块formidable和mime以及他们所对应的版本。 "dependencies":{ "formidable":"^1.2.1", "mime":"^2.3.1" } }
只要package.json这个文件存在,npm就会自动将下载的模块记录到这个文件当中。
假设现在别人将一个项目传递过来,但是并没有传递node_modules这个文件夹,那么该如何启动这个项目?
首先在命令行工具中输入npm install,此时npm这个工具会自动到项目的根目录中查找package.json这个文件,然后在这个文件中找到dependencies选项,根据这个选项来下载第三方模块。完成npm install之后就会在目录中生成node_modules这个文件夹。
项目依赖
在项目的开发阶段和线上运营阶段,都需要依赖的第三方包,称为项目依赖。这种依赖主要是指项目运行过程中所要依赖的提供API接口的第三方库文件。
使用npm install 包名 命令下载的文件会默认被添加到package.json文件的dependencies字段中。
{ "dependencies":{ "jquery":"^3.3.1" } }
开发依赖
在项目的开发阶段需要依赖,线上运营阶段不需要依赖的第三方。比如gulp,项目开发完成之后就没有必要使用了。
使用npm install 包名 --save-dev命令将包添加到package.json文件的devDependencies字段中。
{ "devDependencies":{ "gulp":"3.9.1" } }
将项目依赖以及开发依赖进行区分的好处:可以让我们在不同的运行环境下下载不同的依赖。
如果是线下的开发环境,可以使用 npm install下载全部的依赖
如果是线上的运营环境, 就是处于服务器的运行环境下,使用npm install --production只会下载dependencies下的依赖。
package-lock.json文件的作用
下载第三方模块时,npm会同时产生另外一个文件 —— package-lock.json。这个文件中详细记录了模块与模块之间的依赖关系。
- 锁定包的版本,确保再次下载时不会因为包版本不同而产生问题。
- 加快下载速度,因为该文件中已经记录了项目所依赖第三方的树状结构和包的下载地址,重新安装时只需下载即可,不需要做额外的工作。