Node是什么?
node就是基于Chormev8引擎的JS代码运行环境,他是一个软件。
如何使用命令行工具运行.js文件?
鼠标右键点击no.js,选择在外部资源管理器中打开,按住Shift点击鼠标右键,打开PowerShell窗口
输入node no.js就可以运行了
(一些操作:1 Tab键可以补全文件名。2 执行完一次命令后按一下↑可以回到上一个命令. 3 直接输入clear可以清空命令行)
什么是模块化开发?
实践:
add相当于exports的一个属性。
两种导出方式是没区别的,但是当module.exports指向的对象改变时,就以module.exports指向的对象为准。如下:
上面的同时导出了x与greeting这个方法,但是module.exports指向了另外一个对象,输出就是:module.exports这个新对象:
怎么理解上面这句话呢?就是说node运行环境提供了很多API可以用,这些API与之前JS的API使用上有些不同,nodejs的API都是以模块化的方式开发的,所以这些API也叫做系统模块。(系统模块就是node的API,因为开发这些API的方式是模块化开发的,所以这些API也叫系统模块)
下面介绍几个系统模块(也就是node的API)
注:node的系统模块使用上也有区别,并不想JS可以直接用,需要引用。
例如:系统模块: fs (文件操作)
API语法:
因为读取文件是硬盘的操作需要耗时,所以需要回调函数的方式获取文件读取的结果,回调函数又有两个参数err与doc。
实际操作:
下面再来看看fs这个系统模块中的一个方法writeFile
API语法:
实际操作:
(一样的,先引入fs这个系统模块,第一个参数是你要写入的那个文件,如果没有的话,会帮你自动创建第二个参数是内容,第三个参数也是一个回调函数,如果成功返回null,如果失败返回一个对象,里面是错误信息)
下面说一下path系统模块(路径操作)
path用来拼接路径,不同的操作系统的路径分割符不一样,window使用/ \ 都可以,但是Linux是使用/,如:
path会判断你的操作系统是什么,然后使用对应的分隔符进行拼接。
API语法:
实际操作:
输出:
绝对路径:
一般写绝对路径比较安全,因为命令行可能不在当前文件目录。
所以平时写路径可以像下面这么写(__dirname可以获取到绝对路径,注意是两个下划线)
第三方模块:
npm其实也是也以第三方模块,不过在下载node的时候已经下好了。
所以项目想要下载第三方模块可以通过npm install 模块名称 下载
下载完成后会在当前目录下自动生成一个文件夹:node_modules
nodemon也是一个第三方模块,如果没安装就
,node命令与nodemon命令有什么区别?
使用nodemon执行js会将文件挂起,JS文件一修改就再次执行,当想使用命令行做其他操作时,可以按Ctrl+c 结束nodemon命令。
Gulp也是一个第三方模块
Gulp的使用:
快速生成package.json实际操作:
举个例子:在这个项目内安装两个第三方依赖formidable和mine
下载好后可以看到package.json中多了一个名字为依赖的对象。
文件在中也多出了这两个第三方依赖。
在实际中,如果传递给别人项目时,把node_module文件也传递给别人,那么传递会非常慢,所以利用package.json可以进路第三包这个特点就可以不用传递node_module这个文件夹,直接生成就可以了。
例如:
先把node_module删除
但是别人的项目中package.json是有记录的。
直接在文件中运行npm install (npm这个工具会自动去找package.json这个文件,找到dependenice)
发现文件夹中又恢复了node_module这个文件
补充:依赖分为线上依赖(项目运行依赖)和开发依赖。
比如gulp就是开发依赖,用于打包,压缩文件,如果只想让项目运行起来,只需要安装线上依赖
线上依赖与开发依赖在package.json中的存储位置也不同。
例如:现在在刚才desc项目中安装gulp看看(npm install gulp --save-dev)
(--save-dev一定要加,它可以知道他是开发依赖,不然在后面npm install --production会把所有依赖都下载下来 )
然后看看node_module中的文件,瞬间多了几百个文件夹
然后我们只是想让项目跑起来,我们不需要把开发依赖也下载下来,所以我们可以一开始的时候不运行npm install下载所有依赖,而是npm install --production 只下载运行时需要的依赖。
实践一下:(这个文件中现在有了三个依赖gulp, formidable, mine现在只需要后两个)
1 先把node_module删除.
2 运行npm install --production
可以看到开发依赖并没有下载下来(前提是安装gulp时用的是npm install gulp --save-dev命令,而不是npm install gulp命令,如果是后者那个package.json也不能识别是运行依赖还是开发依赖。)
package.json中scripts对象的作用?
命令别名(可以为命令重新起名字,下次想想在控制台运行此命令时直接npm run 命令名,就行了)
举个例子:
然后在项目中新建一个app.js文件。
来到控制台,输入:npm run a ,可以看到命令也生效。
package-lock.json的作用?
1 加快包的下载速度(因为该文件记录了项目所依赖第三方包的下载地址和包的树形结构,重新安装时只需要下载即可,不需要做额外的工作)
2 锁定包的版本,确保再次下载时不会因为包的版本不同而产生问题
补充:文件查找规则。
两种情况前面有些不同,没有后缀时就比较简单,没有后缀与路径时就比第一种情况多了一些规则,两个都有:先找同名js文件,没有就找同名文件夹,找到文件夹后运行index.js,没有就去看看package.json中的默认要执行哪个文件,再去执行
今天:
1 fs是node的系统模块(就是API,因为开发方式不同就给他重新起名)
2 fs中的两个方法readFile , writeFile 记住第三个回调函数里面的参数。
补充:./ 表示当前目录, ../表示上一级目录
总结:
fs 用于操作文件
readFile writeFile
path 用于操作路径
join()
http
creatServer()创建服务器
当请求方式是get时:
url
parse()把URL地址变成对象
当请求方式是post时:
querystring
parse()把参数变为对象
第三方模块:nodemon , gulp , npm
req的属性:
req.methon 获取请求方式(一般配合toLowerCase()使其转化为小写)——req.methon.toLowerCase()
req.url 获取url (一般配合内置模块url,通过url.parse()方法使其转为对象)——url.parse(req.url)