一、node简介
(一) node特点
- 事件驱动
- 非阻塞IO模型(异步)
- 轻量和高效
(二)node作为中间层
在前端和后端之间加入一层,前端并不是直接去请求后端业务接口,而是请求到中间层,再由中间层去请求业务接口。
客户端直接请求到中间层的node服务,node服务分析请求,看需要哪个页面,再去请求对应的数据,拿到数据后和模板结合成用户看到的页面,再给到客户端。
二、模块的导出与导入
- 导出模块
创建01.mode-A.js文件const add = (n1, n2)=>n1+n2; //导出函数add,第一个add表示的是exports的一个属性,第二个add表示的是函数add exports.add = add; //导出的第二种方式,但是当modele.exports.add遇上了exports.add以modele.exports.add为准 //modele.exports.add = add; setTimeout(()=>{ //输出{add:123} console.log(exports); },2000)
- 导入模块
-
在没有任何内容导出去的时候获取某个文件内容,会得到一个空对象
-
多次导入同一个文件是,导入执行被执行一次,并且在使用的过程中进行初始化,之后缓存起来便于后续继续使用。
创建01.mode-B.js文件
//导入模块时,模块的后缀可以省略,如下的.js可以省略 //如果mode-A中没有使用exprots,则a为一个空的对象 //常量a指针指向的是model-A文件中的exprots对象,在本文件中改变exprots对象中的属性,会影响model-A文件中的exprots const a = require('./lib.js'); console.log(a.add(10, 20)); a.add = 123; console.log(a);
- 用node执行01.mode-B.js文件(前提是在控制台中进入到文件所在的文件夹)
node 01.mode-B.js
- exports是module.exports的别名(地址引用关系),导出对象最终以module.exports为准
注意:
- 系统默认设置了:exports = modules.exprots
- 使用exports时,只能单个设置属性exports.a= a
- module.exports可以单个设置属性,也可以整个赋值
A.js文件中
module.exports = {
name:'张三'
};
exports={
name:'李四'
}
B.js文件中
const a = require('A.js')
console.log(a);
输出结果为:{name:‘张三’}
三、文件系统模块
Node运行环境提供的API. 因为这些API都是以模块化的方式进行开发的, 所以我们又称Node运行环境提供的API为系统模块
http://nodejs.cn/api/
(一).fs文件操作
f: file 文件, s: system系统, 文件操作系统
[1]. 文件读取操作readFile
fs.readFile('文件路径/文件名称' [, '文件编码']. callback)
callback 有两个参数:err和doc,如果文件读取错误,参数err的值为错误对象,否则err的值为null,doc参数为文件内容
const fs = require('fs');
fs.readFile('./1.mode-A.js','utf8',(err, doc)=>{
if(err === null){
console.log(doc);
}else{
console.log('文件读取失败:', err);
}
})
[2].文件写入操作writeFile
如果文件不存在,则自动创建,callback中的参数err为空时表示写入成功
fs.writeFile('文件路径/文件名称','需要写入的数据',callback)
const fs = require('fs');
fs.writeFile('./a.text','aaaa', (err)=>{
if(err !== null){
console.log(err);
return;
}
console.log('写入成功');
})
(二).path路径操作
[1].路径拼接语法
// 导入path模块
const path = require('path');
// 路径拼接
let finialPath = path.join('itcast', 'a', 'b', 'c.css');
// 输出结果 itcast\a\b\c.css
console.log(finialPath);
[2].相对路径VS绝对路径
- 大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具(即控制台)的当前工作目录
- 在读取文件或者设置文件路径时都会选择绝对路径
- 使用__dirname获取当前文件所在的绝对路径
- 使用__filename
- require可以使用相对路径
[2].nodejs进程信息
console.log(process)
四、第三方模块
npm(node package manager): node 的第三方包(模块)管理工具
包就是别人写的 Node.js 模块
(一) 操作
[1]. 获取第三方模块
下载的位置是命令行工具工作目录下的node_modules文件夹下
npm install 模块名称
[2]. 卸载第三方模块
npm uninstall 模块名称
[3].全局安装与本地安装
- 命令行工具:全局安装
- 库文件:本地安装
(二) 使用常见的第三方模块
[1].nodemon 重新执行工具
nodemon是一个命令行工具,用以辅助项目开发。
在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐。
1.全局安装
npm install nodemon -g
2.使用
在命令行工具中用nodemon命令替代node命令执行文件
nodemon 文件名
3.终结nodemon
ctrl + c
[2]. nrm 地址切换工具
nrm ( npm registry manager ):npm下载地址切换工具
-
全局安装
npm install nrm -g
-
查询可用的下载地址列表
nrm ls
-
切换下载地址
nrm use 地址名称 #使用 nrm ls 查看自己所使用的地址
[3]. Gulp 4.0 前端构建工具
https://github.com/gulpjs/gulp
基于node平台开发的前端构建工具
将机械化操作编写成任务, 想要执行机械化操作时执行一个命令行命令任务就能自动执行了
报错:The following tasks did not complete
参考:
https://blog.csdn.net/qq_41208114/article/details/79109269?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
pipe()是读写文件更简单的方法
1. 功能
- 用机器代替手工,提高开发效率。
- 项目上线,HTML、CSS、JS文件压缩合并
- 语法转换(es6、less …)
- 公共文件抽离
- 修改文件浏览器自动刷新
2. 下载
在控制台,进入到项目目录下,输入
#本地安装
npm install gulp
3.Gulp中提供的方法
- gulp.src():获取任务要处理的文件
- gulp.dest():输出文件
- gulp.task():建立gulp任务
- gulp.watch():监控文件的变化
4.简单使用
-
1). 重构项目文件夹结构
- ①.在项目根目录新建gulpfile.js文件(和src目录平级)
- ②.在项目根目录下新建src目录用于放置源码,新建dist目录用于放置构建后的文件.
- ③.将一个网站项目放入到src文件夹中
-
2).编写任务
在gulpfile.js文件中编写任务,实现一个拷贝任务//引入gulp模块 const gulp = require('gulp'); //使用gulp.task建立任务 // task方法的参数 // 参数1: 任务的名称 // 参数2:任务的回调函数 gulp.task('first',()=>{ console.log('开始执行Gulp任务'); return gulp.src('./src/css/about.css').pipe(gulp.dest('./dist/css')) });
-
3).安装gulp的命令行工具
npm install gulp-cli -g
-
4). 在命令行工具中执行gulp任务
gulp first
5. Gulp插件
- gulp-htmlmin :html文件压缩
- gulp-csso :压缩css
- gulp-babel :JavaScript语法转化
- gulp-less: less语法转化
- gulp-uglify :压缩混淆JavaScript
- gulp-file-include 公共文件包含
- browsersync 浏览器实时同步
6.使用插件
压缩html:https://www.npmjs.com/package/gulp-htmlmin
-
① 下载插件
在项目根目录(src同级目录)下是使用npm install gulp-htmlmin
-
② 在gulpfile.js中引用插件,并创建任务,在dist目录下会生成压缩后的html
const htmlmin = require('gulp-htmlmin'); gulp.task('htmlmin', ()=>{ return gulp.src('./src/*.html') //压缩html文件 .pipe(htmlmin({collapseWhitespace: true})) //输出 .pipe(gulp.dest('./dist')); });
7.执行多个任务
回调函数可以省略
gulp.task('build',gulp.series('htmlmin', 'first', (cb) => {
cb()
}))
(三) package.json 项目描述文件
项目描述文件,记录了当前项目信息,例如项目名称、版本、作者、github地址、当前项目依赖了哪些第三方模块等。
使用 npm init -y 命令自动生成package.json文件。
当安装其他插件时,会自动将安装信息写入package.json文件中
[1]. 项目依赖与开发依赖
-
项目依赖
在项目的开发阶段和线上运营阶段,都需要依赖的第三方包,称为项目依赖
使用 npm install 包名命令下载的文件会默认被添加到 package.json 文件的 dependencies 字段中 -
开发依赖
在项目的开发阶段需要依赖,线上运营阶段不需要依赖的第三方包,称为开发依赖
使用 npm install 包名 --save-dev 命令将包添加到package.json文件的devDependencies字段中 -
使用 npm install --production 命令只会安装项目依赖的文件
[2]. package-lock.json文件的作用
- 锁定包的版本,确保再次下载时不会因为包版本不同而产生问题
- 加快下载速度,因为该文件中已经记录了项目所依赖第三方包的树状结构和包的下载地址,重新安装时只需下载即可,不需要做额外的工作
四、Node.js中模块的加载机制
(一) 模块查找规则-当模块拥有路径但没有后缀时
- require方法根据模块路径查找模块,如果是完整路径,直接引入模块。
- 如果模块后缀省略,先找同名JS文件再找同名JS文件夹
- 如果找到了同名文件夹,找文件夹中的index.js
- 如果文件夹中没有index.js就会去当前文件夹中的package.json文件中查找main选项中的入口文件
- 如果找指定的入口文件不存在或者没有指定入口文件就会报错,模块没有被找到
(二) 模块查找规则-当模块没有路径且没有后缀时
- Node.js会假设它是系统模块
- 在系统模块中没有找打,Node.js会去node_modules文件夹中
- 首先看是否有该名字的JS文件,
- 再看是否有该名字的文件夹,
- 如果是文件夹看里面是否有index.js,
- 如果没有index.js查看该文件夹中的package.json中的main选项确定模块入口文件
- 否则找不到报错