2021.2.28
文章目录
- Node.js(一)
- Node基础
- Node开发概述
- 为什么要学习服务器端(后端)开发基础
- 服务器端开发要做的事情
- 为什么选择Node
- Node是什么
- Node.js运行环境安装
- Node.js快速入门
- Node.js的组成
- Node.js基础语法
- Node.js全局对象global
- Node中的模块加载及包
- Node.js模块化开发
- JavaScript开发弊端
- 软件中的模块开发
- Node.js中模块化开发规范
- 模块成员导出
- 模块成员导入
- 模块成员导出的另一种方式
- 系统模块
- 什么是系统模块
- 系统模块fs 文件操作
- 系统模块path 路径操作
- 第三方模块
- 什么是第三方模块
- 获取第三方模块
- 第三方模块 nodemon
- 第三方模块 nrm
- 第三方模块 Gulp
- package.json文件
- node_modules文件夹的问题
- package.json文件的作用
- 项目依赖
- 开发依赖
- package-lock.json文件的作用
- Node.js中模块的加载机制
- 模块查找规则-当模块拥有路径但是没有后缀时
- 模块查找规则-当模块没有路径且没有后缀时
Node.js(一)
Node基础
Node开发概述
为什么要学习服务器端(后端)开发基础
- 能够和后端程序员更加紧密的配合
- 网站业务逻辑前置,学习前端技术需要后端技术支持(Ajax)
- 扩展知识视野,能够站在更高的角度审视整个项目
服务器端开发要做的事情
- 实现网站的业务逻辑(比如登录)
- 数据的增删改查
为什么选择Node
- 使用JavaScript语法开发后端应用
- 一些公司要求前端工程师掌握Node开发
- 生态系统活跃,有大量开源库可以使用
Node是什么
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 代码运行环境。
运行环境:
- 浏览器(软件)能够运行JavaScript代码,浏览器就是JavaScript代码的运行环境。
- Node(软件)能够运行JavaScript代码,Node就是JavaScript代码的运行环境。
Node.js运行环境安装
官网:https://nodejs.org/en/
我们会看到两个版本,截至(2021.2.28):
- 14.16.0 LTS(推荐)
LTS=Long Term Support长期支持版 稳定版 - 15.10.0 Current
Current 拥有最新特性,开发版、实验版
安装步骤:
打开官网–>downloads–>选择版本node-v14.16.0-x64.msi(windows64位)–>下载好后双击安装包–>一路next直到finish
验证是否安装成功:
在Windows搜索找到PowerShell调开命令行工具。输入node -v
。只要显示出正确的版本信息就表示成功了。
PATH环境变量
存储系统中的目录,在命令行执行命令的时候系统会自动去这些目录中查找命令的位置。
Node.js快速入门
Node.js的组成
- JavaScript由三部分组成,ECMAScript(核心,规定了语法部分)、DOM、BOM(浏览器为这门语言提供的一些API)
- Node.js是由ECMAScript及Node环境提供的一些附加API组成的,包括文件、网络、路径等待一些更加强大的API。
- ECMAScript
- Node模块化API
Node.js基础语法
所有ECMAScript语法在Node环境中都可以使用。
var first = 'hell nodejs';
console.log(first);
function fn() {
console.log('fn函数被调用了');
}
fn();
for (var i = 0; i < 5; i++) {
console.log(i);
}
if (true)
console.log('123');
我们平时写的js文件借助html文件用浏览器显示,这里的node我们借助命令行powershell,保证路径要和我们所写的js文件路径一致。输入node 文件名
。
使用命令行的一些小tip:
- 快速找到路径的方法:
- 使用vscode右键文件—>在集成终端中打开
- 打开文件所在文件夹,按住shift键右击—>在此处打开powershell窗口
- 写文件名的时候可以写前面几个字符然后按tab键自动补全
- clear可以清屏
Node.js全局对象global
在浏览器中,全局对象是window,在Node中全局对象是global。
Node中全局对象有以下方法,可以在任何地方使用,global可以省略。
- console.log():在控制台输出
- setTimeout():设置超时定时器
- clearTimeout():清除超时定时器
- setInterval():设置间歇定时器
- clearInterval():清除间歇定时器
Node中的模块加载及包
Node.js模块化开发
JavaScript开发弊端
JavaScript在使用时存在两大问题,文件依赖和命名冲突。
软件中的模块开发
一个功能就是一个模块,多个模块可以组成完整应用,抽离一个模块不会影响其他功能的运行。
Node.js中模块化开发规范
- Node.js规定一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到。
- 模块内部可以使用exports对象进行成员导出,使用require方法导入其他模块。
A模块(a.js) B模块(b.js)
---------------------------- --------------------------
加法函数 A模块=require(A模块路径)
减法函数 //require方法有个返回值就是
乘法函数 //exports对象
A模块.减法()
A模块.加法()
//给exports对象添加属性和方法
exports.加法=加法
exports.减法=减法
模块成员导出
//a.js
//在模块内部定义变量
let version = 1.0;
//在模块内部定义方法
const sayHi = name => `您好,${name}`;
//向模块外部导出数据
exports.version=version;
exports.sayHi=sayHi;
模块成员导入
//b.js
//在b.js模块中导入模块a
let a = require('./a.js');
//输出b模块中的version变量
console.log(a.version);
//调用b模块中的sayHi方法并输出其返回值
console.log(a.sayHi('Node先生'));
Note:
导入模块时后缀可以省略。require('./a.js');
–>require('./a');
模块成员导出的另一种方式
module.exports.version = version;
module.exports.sayHi = sayHi;
exports是module.exports的别名(地址引用关系),
当exports对象和module.exports对象指向的不是同一个对象时,导出对象最终以module.exports为准。
系统模块
什么是系统模块
系统模块,即Node运行环境提供的API。因为这些API都是以模块化的方式进行开发的,所以我们又称Node运行环境提供的API为系统模块。
系统模块fs 文件操作
f:file文件,s:system系统,文件操作系统。
如果我们要使用其他模块则我们要引入这个模块,系统模块也不例外。
const fs=require('fs');
读取文件内容:
fs.readFile('文件路径/文件名称',['文件编码'],callback);
比如说,当客户端访问服务器端的时候,请求index.html,也就是首页,服务器端需要先在它的硬盘当中找到这个文件,并读取出文件的内容,再将文件的内容返回给客户端,这就是readFile读取文件内容的应用场景。
Note:
1.阅读文档时看见参数有中括号说明这是一个可选参数。
2.callback是一个回调函数,我们约定,当某一个API是一个回调函数的时候,我们就使用callback作为标识。
读取文件具体语法示例:
//读取上一级css目录下中的base.css
fs.readFile('../css/base.css','utf8',(err,doc)=>{
//如果文件读取发生错误,参数err的值为错误对象,否则err为null
//doc参数为文件内容
if(err==null){
//在控制台输出文件内容
console.log(doc);
}
});
//1.通过的名字fs对模块进行引用
const fs = require('fs');
//2.通过模块内部的readFile读取文件内容
fs.readFile('./01-helloworld.js', 'utf8', (err, doc) => {
//如果文件读取出错err 是一个对象,包含错误信息
//如果文件读取正确 err是null
//doc 是文件读取的结果,即内容
console.log(err);
console.log(doc);
});
Note:
读取文件是硬盘的操作,它需要耗时,我们需要用回调函数的方式获取文件读取的结果,这个函数有两个参数,第一个是error,这个error是一个对象,包含文件出错信息,如果没有出错,则error返回的是null,第二个参数document返回的是读取的结果,即文件的内容。
写入文件内容:
fs.writeFile('文件路径/文件名称','数据',callback);
比如在网站的运行过程中要监控网站的运行情况,当运行报错时,网站可以将错误信息写到错误日志中。程序员上班时只要查看错误日志,就能直到网站运行是否报错,报了怎样的错误了。这就是文件写入的场景。
Note:
callback的参数是err,如果写入操作成功,则值为null,如果操作失败,则err的值是一个对象,包含了错误信息。
具体代码示例:
const fs=require('fs');
const content='<h3>正在使用fs.writeFile写入文件内容</h3>';
//如果没有这个文件,这个api会帮我们自动创建这个文件
fs.writeFile('../index.html',content,err=>{
if(err!=null){
console.log(err);
return;
}
console.log('文件写入成功');
});
系统模块path 路径操作
为什么要进行路劲拼接
- 不同操作系统的路径分隔符不统一
- /public/uploads/avatar
- Windows 上是 \ /正斜杠反斜杠都可以
- Linux 上是 /
路径拼接语法
path.join('路径','路径',···)
实际代码示例
//导入path模块
const path=require('path');
//路径拼接
let finalPath=path.join('node','a','b','c.css');
//输出结果node\a\b\c.css
console.log(finalPath);
相对路径VS绝对路径
- 大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具的当前工作目录
- 在读取文件或者设置文件路径都会选择绝对路径
- 使用
__dirname
获取当前文件所在的绝对路径
实例
const fs=require('fs');
const path=require('path');
fs.readFile(path.join(__dirname,'01-helloworld.js'),'utf8',(err,doc)=>{
console.log(err)
console.log(doc)
});
第三方模块
什么是第三方模块
别人写好的、具有特定功能的、我们能直接使用的模块即第三方模块,由于第三方模块通常都是由多个文件组成并且被放置在一个文件夹中,所以又名包。
第三方模块有两种存在形式:
- 以js文件的形式存在,提供实现项目具体功能的API接口
- 以命令行工具形式存在,辅助项目开发
获取第三方模块
npmjs.com:第三方模块的存储和发布仓库
npm(node package manager):node的第三方模块管理工具
- 下载:在命令行工具键入
npm install 模块名称
(npm本身是命令) - 卸载:
npm uninstall 模块名称
全局安装与本地安装
- 命令行工具:全局安装(所有项目都可以使用到这个命令行工具)
- 库文件:本地安装(只有当前项目可以使用这个模块)
第三方模块 nodemon
nodemon是一个命令行工具,用以辅助项目开发。
在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐。
使用步骤
- 使用
npm install nodemon -g
下载它
- npm是命令、install是安装、nodemon是模块名字
- -g的g代表global,全局安装,在我们写任何项目的时候都可以直接使用
- 在命令行工具中使用
nodemon
命令替代node命令执行文件 - 终止操作:
ctrl+c
第三方模块 nrm
nrm(npm registry mananger):npm下载地址切换工具
npm默认的下载地址在国外,国内下载速度慢,目的是切换地址提高下载速度。
国外:npmjs.com
|
\|/
国内:npm.taobao.org
|
\|/
开发者
使用步骤
- 使用
npm install nrm -g
下载它,也是全局安装 - 查询可用下载地址列表
nrm ls
,ls即list,列表的意思,就可以列出国内可用的下载地址 - 切换npm下载地址:
nrm use 下载地址名称
,一般选择taobao
第三方模块 Gulp
Gulp是基于node平台开发的前端构建工具。
前端构建工具:将机械化操作编写成任务,想要执行机械化操作时执行一个命令命令任务就能自动执行了。
用机器代替手工,提高开发效率。
Gulp能做什么
- 项目上线,HTML、CSS、JS文件压缩合并
- 语法转换(es6、less···)
- 公共文件抽离
- 修改文件浏览器自动刷新
Gulp使用步骤
- 使用
npm install gulp
下载gulp库文件,因为是库文件,所以本地安装。 - 在项目根目录下建立gulpfile.js文件,这个文件名是官方要求的不能随便更改。
- 重构项目的文件夹结构:src目录放置源代码文件,dis目录放置构建后的文件。
- 在gulpfile.js文件中编写任务
- 在命令行工具中执行gulp任务
Gulp中提供的方法
- gulp.src():获取任务要处理的文件
- gulp.dest():输出文件
- gulp.task():建立gulp任务
- gulp.watch():监控文件的变化
使用示例:(写在gulpfile.js中)
//引用gulp模块
const gulp=require('gulp');
//使用gulp.task()方法建立任务
//gulp.task()方法有两个参数:
//第一个参数是任务名称;第二个参数是任务的回调函数
gulp.task('first',()=>{
//获取要处理的文件
gulp.src('./src/css/base.css')
//将处理后的文件输入到dist目录中
.pipe(gulp.dest('./dist/css'));
});
使用node命令去执行是执行整个文件,而这里我们是执行第一个任务。
gulp这个第三方模块除了给我们提供了库文件,还给我们提高了同名的命令行工具。
我们先要去下载他npm install gulp-cli -g
;
之后,在命令行执行gulp 任务名
,比如这里的gulp first
。
gulp插件
- gulp-htmlmin:html文件压缩
- gulp-csso:压缩css
- gulp-babel:JavaScript语法转化
- gulp-less:less语法转化
- gulp-uglify:压缩混淆JavaScript
- gulp-file-include:抽取公共文件
- browsersync:浏览器实时同步
使用步骤
- 先下载
npm install 插件名
,比如npm install gulp-htmlmin
- 之后我们需要引用
const htmlmin=require('gulp-htmlmin');
- 最后再调用
gulp.task('htmlmin',()=>{
return gulp.src('src/*.html')
//压缩html文件的代码,collapse倒塌,这句话意思是是否折叠空格
.pipe(htmlmin({collapseWhitespace:true}))
.pipe(gulp.dest('dist'));
})
package.json文件
node_modules文件夹的问题
- 文件夹以及文件过多过碎,当我们将项目整体拷贝给别人的时候,传输速度会很慢很慢。
- 复杂的模块依赖关系需要被记录,确保模板的版本和当前保持一致,否则会导致当前项目运行报错
package.json文件的作用
项目描述文件,记录了当前项目信息,例如项目名称、版本、作者、github地址、当前项目依赖了哪些第三方模块等。使用npm init -y
命令生成。其中-y
的意思是全部采用默认值。
项目依赖
- 在项目的开发阶段和线上运营阶段,都需要依赖的第三方包,称为项目依赖
- 使用
npm install 包名
命令下载的文件都会默认被添加到package.json文件的dependencies字段中。
{
"dependencies": {
"formidable": "^1.2.2",
"mime": "^2.5.2"
}
}
开发依赖
- 在项目的开发阶段需要依赖,线上运营阶段不需要依赖的第三方包,称为开发依赖
-
使用npm install 包名 --save -dev
命令将包添加到package.json文件的devDependencies字段中
Note:
1.--save-dev
会把我们当前安装的模块安装到devDependencies模块中,以此来区分项目依赖和开发依赖。
2.npm install
会下载所有依赖
3.npm install --production
只会下载项目依赖,即不会下载devDependencies中的依赖
package-lock.json文件的作用
- 锁定包的版本,确保再次下载时不会因为包版本不同而产生问题
- 加快下载速度,因为该文件已经记录了项目所依赖第三方包的树状结构和包的下载地址,重新安装时只需下载即可,不需要做额外的工作
Node.js中模块的加载机制
模块查找规则-当模块拥有路径但是没有后缀时
- require()方法根据模块路径查找模块,如果是完整路径,直接引入模块
require('./find.js');
- 如果模块后缀省略,先找同名JS文件再找同名JS文件夹
require('./find');
- 如果找到了同名文件夹,找文件夹中的index.js
- 如果文件夹中没有index.js就会去当前文件夹中的package.json文件中查找main选项中的入口文件
- 如果指定的入口文件不存在或者没有指定入口文件就会报错,模块没有被找到
模块查找规则-当模块没有路径且没有后缀时
require('find');
- Node.js会假设它是系统模块
- Node.js回去node_modules文件夹中
- 首先看是否有该名字的JS文件
- 再看是否有该名字的文件夹
- 如果是文件夹看里面是否有index.js
- 如果没有index.js查看该文件夹中的package.json中的main选项确定模块入口文件
- 否则找不到报错