Node.js
2020年7月19日Node.js的组成
- javaScript 是由三部分组成 ECMAScript DOM BOM
- Node.js 是由ECMAScript 及 Node环境提供的一些附加API组成的,包括文件,网络,路径等等一些强大的API
- 在所有ECMAScript语法在Node环境中都可以使用
node.js全局对象global
- 在浏览器中全局对象是window,在node中全局对象是global
- node中全局对象下有以下方法,可以在任何地方使用,global可以使用
1 2 3 4 5 |
console.log() //在控制台打印 setTimeout() //超时定时执行 clearTimeout() //清除超时定时执行 setInterval() //循环定时设置 clearInterval() //清除循环定时器 |
javaScript开发弊端
- 文件依赖问题
- 文件冲突问题
Nodejs模块化开发
- 一个功能就是一个模块,多个模块可以组成完整的应用,抽离一个模块不会影响其他功能运行.
- Node.js规定一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到
- 模块内可以使用export对象进行成员导出,使用require方法导入其他模块
模块化开发案例
a.js
1 2 3 4 5 6 7 |
const name = 'zf' const age = 18 const fun = item => console.log(`你好${item}`) exports.name = name //导出name exports.age = age //导出age exports.fun = fun //导出fun方法 |
b.js
1 2 3 4 5 |
const a = require('./a.js') //导入a.js console.log(a.age) //调用a.js文件中导出的属性age console.log(a.name) //调用a.js文件中导出的属性name a.fun() //调用a.js文件中导出的方法fun |
模块成员的另一种导出方式
1 2 3 4 5 6 |
/** * exports 是module.exports的别名(引用地址关系), * 如果既有 module.exports 又有 exports 导出的 * 内容以 module.exports 为准 */ module.exports.age = age |
什么是系统模块
Node运行环境提供的API,因为这些APi都是以模块的方式进行开发,所以我们又称Node运行环境提供的API为系统模块
系统模块fs文件操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
const fs = require('fs') /** * 读取文件数据 * ****************************************** * 参数一 : 文件路径 | 文件名 * 参数二 : 文件编码可选,不写就直接写回调函数 * 参数三 : 回调函数 error 错误信息 document读取的文档信息 */ fs.readFile('./1.txt', 'utf-8', (error, document) => { if (error != null) { //如果没错error为null console.log(error) //打印错误信息 return false; //终止程序 } console.log(document) }) /** * 往文件写入数据 如果没有文件就自动创建 * ****************************************** * 参数一 : 文件路径 | 文件名 * 参数二 : 要写入的内容 * 参数三 : 回调函数 error 错误信息 */ fs.writeFile('./1.txt', '清空之前内容写入', (error) => { if (error != null) { //如果没错error为null console.log(error) //打印错误信息 return false; //终止程序 } }) |
系统模块path路径操作
- 不同的操作系统路径的分隔符不统一
- windows上是 \/
- linux上是 /
相对路径vs绝对路径
- 大多数情况下使用绝对路径 , 因为相对路径有时候相对的是命令行工具的当前工作目录
- 在读取文件或者设置文件路径时都会选择绝对路径
- 使用 __dirname获取当前文件所在的绝对位置
案例
1 2 3 4 |
const path = require('path') let myPath = path.join(__dirname,'\/win\/fff/','/awe/www/','/a.css') console.log(myPath) |
什么是第三方模块
别人写好的,具有特定功能的,我们能直接使用的模块即第三方模块,由于第三方模块通常都是由多个文件组成并且被防止在一个文件夹中,所以又名包.
第三方模块既有两种存在形式:
- 以js文件存在,提供实现项目具体功能的API接口
- 以命令行工具形式存在,辅助项目开发
获取第三方模块
npm (node package manager):node的第三方模块管理工具
- 下载:npm install 模块名称
- 卸载:npm uninstall package 模块名称
如果选择包安装的方式
- 命令行工具: 全局安装 -g
- 库文件:本地安装
package.json文件
项目描述文件,记录了当前项目信息,例如项目名称 版本 作者 github地址,当前项目依赖了那些第三方模块等.使用 npm init -y
命令生成
1 |
$ npm init -y |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "name": "demo2", //项目名称 "version": "1.0.0", //项目版本 "description": "", //项目详情 "main": "index.js", //入口文件 "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build" : "nodemon app.ja" /*定义命令别名如 我们进入项目 不需要 'nodemon app.ja' 可以直接 'npm run build' */ }, "keywords": [], //关键词 "author": "", //作者 "license": "ISC" //许可证 } |
项目依赖
- 在项目开发阶段和线上运营阶段,都需要的第三方包,称为项目依赖
- 使用
npm install
包名会默认被添加到package.json文件的 dependencies 字段中 - npm install –production 使用这个命令安装线上环境的依赖
1 2 3 4 5 |
{ "dependencies": { "jquery": "^3.3.1", } } |
开发依赖
- 在项目的开发阶段需要的依赖,向上运营阶段不需要依赖的第三方包,称为开发依赖
- 使用 npm install 包名 –save-dev命令将包添加到package.json文件的devDependencies字段中
1 2 3 4 5 |
{ "devDependencies": { "gulp": "^4.0.2", }, } |
package-lock.json文件的作用
- 锁定包版本,确保再次下载时不会因为包依赖而产生不同版本
- 加快下载速度,因为改文件中已经记录项目所依赖第三方包的树张结构和包的下载地址,重新安装时只需下载即可,不需要做额外的工作
模块查找规则
1当模块拥有路径但没有后缀时
1 |
const path = require('./mode/add') |
- require方法根据模块路径查找模块,如果是完整路径直接引用模块
- 如果模块后省略,先找同名js文件 ,再找同名文件夹,
- 如果找到同名文件夹,再到文件夹中找index.js
- 如果文件夹中没有index.js就会到当前所在文件夹中的package.js文件中(以当前案例为参考是./mode/add的package.js ),查找main选项中的入口文件.
- 如果指定的文件不存在或者没有指定入口文件就会报错,模块没有找到
2.没有路径没有后缀时
- 首先假设是系统模块,如果系统模块里没有
- node.js会去node_modules文件夹中,先看有没有.js文件,再看是否有同名文件
- 如果有文件看是否有index.js文件如果没有
- 看改文件夹中package.json中的main字段来确定模块入口文件
- 如果这都没有就保存