Nodejs
Node.js的组成
JavaScript有ECMAScript和DOM和BOM组成
Node.js是由ECMAScript及Node环境提供的一些附加API组成,包括文件、网络、路径等等一些更加强大的API

Node.js语法
所有ECMAScript语法在Node环境中都可以使用。
Node怎么去执行js文件
在CMD或者powershell中 在js文件所在的路径下 执行 node 文件名 即可执行js文件
快速打开powershell的方法在文件所在的目录下,按下shift + 鼠标右键,在powershell中打开当前路径。
文件名快速补充的快捷键:输入文件前几个字母按下 tab键即可

Node.js的全局对象
在浏览器中全局对象是window,在Node中全局对象是global。global和window一样都可以省略
Node中全局对象下有以下方法,可以在任何地方使用,global可以省略。
console.log() 在控制台中输出
setTimeout() 设置超时定时器
clearTimeout() 清除超时时定时器
setInterval() 设置间歇定时器
clearInterval() 清除间歇定时器
1 global.console.log('我是global对象下面的console.log方法输出的内容'); 2 3 global.setTimeout(function (){ 4 console.log('123'); 5 }, 2000); 6 7 8 ----------------------------------------------------------- 9 // global 可以省略 10 console.log('我是global对象下面的console.log方法输出的内容'); 11 12 setTimeout(function (){ 13 console.log('123'); 14 }, 2000)
Node.js模块化开发
JavaScript在使用时存在两大问题,文件依赖和命名冲突。

Node.js模块化开发规范
Node.js规定一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到
模块导出
模块内部可以使用exports对象进行成员导出, 使用require方法导入其他模块

代码示例:
1 // a 模块,将加法函数导出 2 const add = (n1,n2) => n1+n2; 3 4 // exports 将需要导入的模块导出 5 exports.add = add; 6 7 8 ------------------------------------------- 9 // b 模块,要使用加法函数,先将a模块导入 10 11 // 将需要使用的模块导入进来,使用require导入。得到的是,导出模块exports的对象 12 // const a = require("./03.module-a.js"); 13 // 加不加.js都可以 14 const a = require("./03.module-a"); 15 16 console.log(a); 17 console.log(a.add(10,20));
模块导出的另一种方式
在exports前面加上module. moudule.exports.属性名 = 导出属性或函数;
exports是module.exports的别名(地址引用关系),导出对象最终以module.exports为准。
代码示例:
1 // module.exports 模块 2 const greating = name => "hell "+name; 3 4 //exports是module.exports的别名(地址引用关系),导出对象最终以module.exports为准 5 module.exports.greating = greating; 6 7 const x = 100; 8 exports.x = x; 9 10 // 当module.exports 和 exports 指向的对象的不同时,以module.exports为准 11 // 这时候导出的只有 下面这个对象 12 module.exports = { 13 name:"张三" 14 }; 15 16 // 以module.exports 导出为准,这样就是错误的,及无效的 17 exports = { 18 age : 20 19 }; 20 21 22 ------------------------------------------------------- 23 // require模块 24 25 const a = require("./04.moudle.exports"); 26 // console.log(a.greating("张三")); 27 28 // 使用moudle.exports和exports一样 29 // console.log(a);//{ greating: [Function: greating], x: 100 } 30 31 // 更改了moudle.exports的指向后 32 console.log(a);//{ name: '张三' }
Node.js 系统模块
系统模块:Node运行环境提供的API. 因为这些API都是以模块化的方式进行开发的, 所以我们又称Node运行环境提供的API为系统模块
fs模块:文件操作
f:file 文件 ,s:system 系统,文件操作系统。
模块的方法:
1,文件读取 fs.reaFile('文件路径/文件名称',['文件编码'], callback);
参数1:文件路径和文件名称。
参数2:文件编码,文件已什么编码编写的就以什么编码打开。
参数3:回调函数,因为该方法没有返回值,则回调函数中保存在返回信息。回调函数有两个默认参数
参1:err :当文件读取过程中出错时,该参数保存出错信息。没有出错则为null
参2:doc:文件读取出来的内容
1 // 1,通过模块的名字对模块进行引入 2 const fs= require("fs"); 3 4 // 2,通过模块内部的readFile方法读 取文件内容 5 fs.readFile("./01.helloword.js","utf8",(err,doc)=>{ 6 // 如果文件读取出错,err是一个对象,包含错误信息 7 // 如果文件读取正确,err 为null 8 // doc 是文件读取的内容 9 console.log(err);//null 10 console.log(doc);// 11 });
2,文件写入:fs.writeFile('文件路径/文件名称', '数据', callback);
参数1:文件写入路径和文件名。如果没有该文件自动创建。
参数2:要写入的数据
参数3:回调函数,因为该方法没有返回值,则回调函数中保存是否写入成功信息。回调函数有一个默认参数
参1:err :当文件写入过程中出错时,该参数保存出错信息。没有出错则为null
1 const fs = require("fs"); 2 3 fs.writeFile("./dome.txt",'即将要写入的内容',err=>{ 4 if(err != null){ 5 console.log(err); 6 return; 7 } 8 console.log("文件内容写入成功"); 9 });
path模块:路径操作
为什么要进行路径拼接
不同操作系统的路径分隔符不统一
/public/uploads/avatar
Windows 上是 \ /
Linux 上是 /
path路径的方法join方法就可以解决这个问题:path.join('路径', '路径', ...)
该方法可以适配不同操作系统下路径分隔符的不同
1 const path = require("path"); 2 // 拼接路径,根据不同的操作系统去适配路径 3 const finallyPath =path.join("public","uploads","avatar"); 4 5 console.log(finallyPath);//public\uploads\avatar
相对路径和绝对路径
在使用路径的时候大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具的当前工作目录。相对于命令行工具的当前目录就会造成在该路径下找不到文件
require 比较特殊,它的相对路径就是相对于当前文件,所有使用require时可以使用相对路径。
__dirname 获取当前文件的绝对路径
1 const fs = require("fs"); 2 const path = require("path"); 3 4 // __dirname 获取当前文件的绝对路径 5 console.log(__dirname);//E:\webprogram\06nodejs\day1 6 console.log(path.join(__dirname,"01.helloword.js")); 7 8 fs.readFile(path.join(__dirname,"01.helloword.js"),"utf8",(err,doc)=>{ 9 console.log(err); 10 console.log(doc); 11 });
第三方模块
别人写好的、具有特定功能的、我们能直接使用的模块即第三方模块,由于第三方模块通常都是由多个文件组成并且被放置在一个文件夹中,所以又名包。
第三方模块有两种形式存在
1,以js文件的形式存在,提供实现项目具体功能的API接口。
2,以命令行工具形式存在,辅助项目开发
第三方模块怎么获取
npmjs.com网站存储了大量第三方模块
在node.js的安装后,它自带了 npm (node package manager) : node的第三方模块管理工具
可以使用npm获取第三方模块和卸载第三方模块
下载:npm install 模块名称
卸载:npm unintall package 模块名称
注意:因为使用的是外国的网站,安装会很慢,解决方法,在模块名后添加 --registry=https://registry.npm.taobao.org
全局安装与本地安装
命令行工具:全局安装
全局安装只需要在模块名后 加上 -g 即可
库文件:本地安装
默认为本地安装,安装在命令行执行npm命令的目录下
nodemon模块
nodemon是一个命令行工具,用以辅助项目开发。
模块下载
1,使用npm install nodemon –g 下载它
2,在命令行工具中用nodemon命令替代node命令执行文件
该模块的使用:将以前执行js 文件前 的node 换成 nodemon即可
该模块作用:
在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐。
使用 nodemon 命令 来指向js文件会使每次执行后程序不终止,将程序挂起,在每次程序保存后,重新来执行一遍。
结束方法:按下Ctrl + C 结束挂起
nrm模块
nrm ( npm registry manager ):npm下载地址切换工具
为了解决:下载慢的问题
模块下载和使用
1,使用npm install nrm –g 下载它
2,查询可用下载地址列表 nrm ls
3,切换npm下载地址 nrm use 下载地址名称

Gulp模块
gulp的下载与使用
1,使用npm install gulp下载gulp库文件
2,在项目根目录下建立gulpfile.js文件
3,创建新的文件夹: src目录放置源代码文件 dist目录放置构建后文件
4,在gulpfile.js文件中编写任务.
5,在命令行工具中执行gulp任务
gulp自带的方法
gulp.src():获取任务要处理的文件
参数:路径。参数还可以是数组,里面传递多个路径
该方法可以调用 .pipe 方法:代表要进行的文件操作,参数里面写要进行的文件操作
gulp.dest():输出文件
参数:输出的路径
gulp.task():建立gulp任务
第一个参数:任务的名字,用来区分不同任务
第二个参数:回调函数,在回调函数中执行每个任务
gulp.watch():监控文件的变化
gulp插件介绍
gulp是一个轻量化的第三方模块,提供的方法恨少,那么需要进行不同的操作就需要安装不同的插件
安装插件方法
1,下载插件 npm 下载 npm install 插件名
2,在gulpfile.js 中引入这个插件
3,调用插件
gulp-cli插件
安装: npm install gulp-cli -g
插件作用:安装了gulp执行命令,就可以在gulp文件夹下,直接使用 gulp 任务名,执行某一个单独的任务。
gulp-htmlmin :html文件压缩
安装:在npm中查找
使用:只需要在.pipe()方法中传入.pipe(htmlmin({collapseWhitespace: true}))
gulp-file-include 公共文件包含
安装:在npm中查找
使用:
抽取HTML文件公共代码:
1,将相同的代码剪切走,放在common文件夹中并且创建一个HTML文件存放这些代码
2,在原来文件中引入进剪切走带代码:@@include('./common/header.html')。@@include(路径)
3,.pipe(fileinclude())
gulp-less: less语法转化
安装:在npm中查找
gulp-csso :压缩css
安装:在npm中查找
gulp-babel :JavaScript语法转化
安装:在npm中查找
gulp-uglify :压缩混淆JavaScript
安装:在npm中查找
1 // 引用gulp模块 2 const gulp = require("gulp"); 3 4 const htmlmin = require("gulp-htmlmin"); 5 const fileinclude = require('gulp-file-include'); 6 7 const less = require('gulp-less'); 8 const csso = require('gulp-csso'); 9 10 const babel = require('gulp-babel'); 11 const uglify = require('gulp-uglify'); 12 13 // 通过gulp.task 建立任务 14 // 第一个参数:任务的名字,用来区分不同任务 15 // 第二个参数:回调函数 16 gulp.task("first", () => { 17 console.log("我们的第一个gulp任务执行了"); 18 19 // 使用gulp.src 获取要处理的文件 20 // .pipe 方法代表要进行的文件操作 21 // dest方法是将文件输出 22 gulp.src("./src/css/base.css") 23 .pipe(gulp.dest("dist/css")); 24 }); 25 26 27 // npm install gulp-cli -g 28 // 安装了gulp执行命令,就可以在gulp文件夹下,直接使用 gulp 任务名,执行某一个单独的任务 29 30 31 // gulp是一个轻量化的第三方模块,提供的方法恨少,那么需要进行不同的操作就需要安装不同的插件 32 // 安装插件方法 33 // 1,下载插件 npm 下载 npm install 插件名 34 // 2,在gulpfile.js 中引入这个插件 35 // 3,调用插件 36 37 38 // gulp插件实例 39 // html 任务 40 // 1,html 文件中代码的压缩操作 41 // 2,抽取HTML文件中的公共代码 42 /* 43 * 抽取HTML文件公共代码: 44 * 1,将相同的代码剪切走,放在common文件夹中 45 * 2,在原来文件中引入进剪切走带代码:@@include('./common/header.html') 46 * 47 * */ 48 49 gulp.task("htmlmin", () => { 50 gulp.src("./src/*.html") 51 .pipe(fileinclude()) 52 53 // 压缩HTML文件中代码 54 // *.html 获取所有的HTML文件 55 .pipe(htmlmin({collapseWhitespace: true})) 56 .pipe(gulp.dest("dist")); 57 }); 58 59 60 // css任务 61 // 1,less语法转换 62 // 2,css代码压缩 63 // gulp.task("cssmin",()=>{ 64 // gulp.src("./src/css/*.less") 65 // .pipe(less()) 66 // .pipe(gulp.dest("dist/css")); 67 // 68 // }); 69 70 gulp.task("cssmin", () => { 71 // 选择css目录下所有的less文件和css文件 72 gulp.src(["./src/css/*.less", "./src/css/*.css"]) 73 // 将less语法转换为css语法 74 .pipe(less()) 75 // 将css 代码进行压缩 76 .pipe(csso()) 77 // 将结果输出 78 .pipe(gulp.dest("dist/css")); 79 80 }); 81 82 83 // js任务 84 // 1,es6代码转换 85 // 2,代码压缩 86 gulp.task("jsmin", () => { 87 gulp.src("./src/js/*.js") 88 // es6转换 89 .pipe(babel({ 90 // 它可以判断当前单面的运行环境,将代码转换为当前运行环境所支持的代码 91 presets: ['@babel/env'] 92 })) 93 // 压缩代码 94 .pipe(uglify()) 95 // 输出 96 .pipe(gulp.dest("dist/js")); 97 98 }); 99 100 101 // 复制文件夹 102 gulp.task("copy", () => { 103 gulp.src("./src/images/*") 104 .pipe(gulp.dest("dist/images")); 105 gulp.src("./src/lib/*") 106 .pipe(gulp.dest("dist/lib")); 107 }); 108 109 110 // 构建任务 111 // 执行default任务后,依次执行后面任务 112 // default方法还需要查查 113 // gulp.task('default', function () { 114 // return gulp.src('src/entry.js') 115 // .pipe(webpack()) 116 // .pipe(gulp.dest('dist/')); 117 // });
package.json 文件
node_modules文件夹的问题
1,文件夹以及文件过多过碎,当我们将项目整体拷贝给别人的时候,传输速度会很慢很慢.
2,复杂的模块依赖关系需要被记录,确保模块的版本和当前保持一致,否则会导致当前项目运行报错
package.json文件解决了问题1
package.json 文件为:项目描述文件,记录了当前项目信息,例如项目名称、版本、作者、github地址、当前项目依赖了哪些第三方模块等。
文件生成方法:
方法1:使用npm init
该方法可以生成package.json 文件,但是生成过程中需填写一些信息,例如项目名称,版本号,项目描述等等
方法2:使用npm init -y命令生成。
所有描述信息都使用默认
项目依赖和开发依赖
项目依赖
在项目的开发阶段和线上运营阶段,都需要依赖的第三方包,称为项目依赖
使用npm install 包名命令下载的文件会默认被添加到 package.json 文件的 dependencies 字段中
开发依赖
在项目的开发阶段需要依赖,线上运营阶段不需要依赖的第三方包,称为开发依赖
使用npm install 包名 --save-dev命令将包添加到package.json文件的devDependencies字段中
怎么区分不同依赖
在安装第三方包的时候:
1,项目依赖就是正常使用 npm install 包名 安装
2,开发依赖在下载的时候 npm install 包名 --save-dev 安装包时添加 --save-dev 代表为开发依赖
有了不同的依赖那么我们在不同环境中就只需要安装不同的依赖即可
在线下开发的时候我们就需要全部的依赖那么在当前文件夹中就需要下载全部的依赖:npm install 该命令会去package.json 中找dependencies和devDependencies来下载全部的依赖
如果在线上的话就只需要项目依赖:npm install –production 只去dependencies中找到项目依赖的第三方包
1 { 2 "name": "description", 3 "version": "1.0.0", 4 "description": "", 5 "main": "index.js", 6 7 // 该字段是执行方法的快捷方式,将比较长的命令放在该字段中 8 // 属性:另外起的名字 9 // 值:比较长的命令 10 // 执行方法:npm run 另外起的名字 11 "scripts": { 12 "test": "echo \"Error: no test specified\" && exit 1", 13 "build": "nodemon app.js" 14 }, 15 16 17 "keywords": [], 18 "author": "", 19 "license": "ISC", 20 "dependencies": { 21 "formidable": "^1.2.2", 22 "mine": "^0.1.0" 23 }, 24 "devDependencies": { 25 "gulp": "^4.0.2" 26 } 27 }
package-lock.json文件的作用
锁定包的版本,确保再次下载时不会因为包版本不同而产生问题
加快下载速度,因为该文件中已经记录了项目所依赖第三方包的树状结构和包的下载地址,重新安装时只需下载即可,不需要做额外的工作
Node.js中模块的加载机制
1,模块查找有路径有后缀
require方法根据模块路径查找模块,如果是完整路径,直接引入模块。
2,模块查找有有路径没有后缀
如果模块后缀省略,先找同名JS文件如果找到直接引入。
如果没有找到同名文件再找同名JS文件夹
如果找到了同名文件夹,找文件夹中的index.js
如果文件夹中没有index.js就会去当前文件夹中的package.json文件中查找main选项中的入口文件
如果找指定的入口文件不存在或者没有指定入口文件就会报错,模块没有被找到
3,模块查找没有路径且没有后缀
Node.js会假设它是系统模块
Node.js会去node_modules文件夹中
首先看是否有该名字的JS文件
再看是否有该名字的文件夹
如果有文件夹看里面是否有index.js
如果没有index.js查看该文件夹中的package.json中的main选项确定模块入口文件
否则找不到报错
------

浙公网安备 33010602011771号