node.js
- node.js规定一个javascript就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到,
- 模块内部可以使用exports对象进行导出,使用require方法导入其他模块
模块成员导出
//在模块内部定义变量
let version = 1.0;
//在模块内部定义变量
let version = 1.0;
//在模块内部定义方法
const sayHi = name =>'您好,$(name)'
//向模块外部导出数据
exports.version = version;
exports.sayhi = sayHi
模块成员的导入
//b.js
//在b.js模块中导入模块a
let a = require('./b.js');
//输出b模块中的version变量
console.log(a.version);
//调用b模块中的sayHi方法
//module-a.js
const add = (n1,n2) => n1 + n2;
//b模块要使用a模块
//对a模块的add函数进行导出操作
exports.add = add;
//module-b.js
//导入a模块操作
//require的返回值就是所导入模块的对象
const a = require("./02.module-a.js");
//导入模块时后缀可以省略
const a = require("./02.module-a.js");
console.log(a);
console.log(a.add(10,20));
模块成员导出的另外一种方式
module.exports.version = version;
module.exports.sayHi = sayHi;
exports是module.exports的别名(地址引用关系),导出对象最终以module.exports为准
模块化导出的两种方式的联系和区别
//module.exports.js
const greeting = name => `hello ${name}`;
const x= 100;
const x = x;
module.exports.greeting = greeting;
//x:100,greeting:[Function:greeting]
//当exports对象和module.exports对象指向的不是同一个对象时,以module.export为准
moudule.exports= {name:'zhangsan'}
//name:zhangsan
exports = {age:20};
//name:zhangsan
//require.js
let a = require(./module.exports.js);
console.log(a)
系统模块
系统模块fs文件操作
const fs = require(‘fs’);
读取文件内容
fs.reaFile(‘文件路径/文件名称’,[‘文件编码’],callback)
写入文件内容
fs.writeFile(‘文件路径/文件名称’,‘数据’,callback)
//读取文件
//1.通过模块的名字fs对模块进行引用
const fs = require('fs');
//2.通过模块内部的readFile读取文件内容
fs.readFile('./01.helloworld.js','utf8',(err,doc) => {
//err输出null,文件读取成功;否则返回错误文件信息
console.log(err);
console.log(doc);
})
//写入文件
const content = '<h3>正在使用fs.readFile写入文件内容</h3>';
fs.writeFile('../index.html',content,err =>{
if(err != null){
console.log(err);
return;
}
console.log('文件写入成功');
});
系统模块path路径
为什么要进行路径拼接
- 不同操作系统的路径分隔符不统一
- /public/uploads/avatar
- Windpws 是/ \
- linux 是/
路径拼接语法
path.join(‘路径’,‘路径’)
相路径VS绝对路径
- 在大多数情况下会使用绝对路径,因为相对路径是命令行工具的当前工作目录
- 在读取文件或设置文件路径时都会选择绝对路径
- 使用__dirname获取当前文件所在的绝对路径
文件目录结构
在文件当前目录下运行结果
在命令行工具上级路径运行结构果
说明:相对路径是命令行工具的当前工作目录
const fs = require('fs');
//引入路径处理模块
const path = require('path');
console.log(__dirname);
console.log(path.join(__dirname,'01.nodeFirst.js'));
fs.readFile(path.join(__dirname,'01.nodeFirst.js'),'utf8',(err,doc) => {
console.log(err);
console.log(doc);
})
C:\Program Files\nodejs>node ./www/08.relative.js
C:\Program Files\nodejs\www
C:\Program Files\nodejs\www\01.nodeFirst.js
null
console.log('hello');
第三方模块
第三方模块有两种存在形式
- 以js文件的形式存在,提供实现项目具体功能的API接口
- 以命令行工具形式存在,辅助项目开发
获取第三方模块
npmjs.com:第三方模块的存储和分发仓库
- 下载:npm install 模块名称
- 卸载 npm uninstall package 模块名称
本地安装和本地安装
- 命令行工具:全局安装
- 库文件:本地安装
第三方模块nodemon
nodemon是一个命令行工具,用来辅助项目开发
在node.js,每次修改文件都要在命令工具中重新执行该文件,非常繁琐
使用步骤
- 使用npm install nodemon -g 下载(全局安装)
- 使用 nodemon 执行文件
nrm:npm的下载地址切换工具
使用步骤
- 使用npm install nrm -g 下载
- 查询可用下载地址列表nrm ls
- 切换npm 下载地址 nrm use 下载地址名称
第三方模块gulp
基于node平台开发的前端构建工具
将机械化操作编写成任务,想要执行机械化操作时执行一个命令行命令任务就能自动执行了
Gulp能做什么
- 项目上线 HTML,CSS,JS文件压缩
- 语法转换(es6,less)
- 公共文件抽取
- 修改文件浏览器自动刷新
Gulp的使用
- 使用npm install gulp下载gulp库文件
- 在项目根目录下建立gulpflle.js文件
- 重构项目的文件夹结构src目录放置源代码文件dist目录放置构建后的文件
- 在gulpfile.js文件找那个编写任务
- 在命令工具中执行gulp任务
Gulp中提供的方法
- gulp.src():获取任务要处理的文件
- gulp.dest():输出文件
- gulp.task():建立gulp任务
- gulp.watch():监控文件的变化
const gulp = require('gulp');
//使用gulp.task()方法建立任务
gulp.task('first',() => {
//获取要处理的文件
gulp.src('./src/css/index.html');
//将处理后的文件输出到dist目录
.pipe(gulp.dest('./dist/css'));
})
Gulp插件
- gulp-htmlmin:html文件压缩
- gulp-csso:压缩css
- gulp-less:less语法转化
- gulp-uglify:压缩混淆JavaScript
- gulp-file-include公共文件包含
- browsersync浏览器实时同步
package.json文件的作用
项目描述文件,距离当前项目信息,例如项目名称,版本,作者,github地址,当前项目依赖了哪些第三方模块等使用npm init -y命令生成
项目依赖
- 在项目的开发剪短和线上运营阶段,都需要依赖的第三方包,称项目依赖
- 使用npm install 包含命令下载的文件会默认被添加到package.json文件的dependencies字段中
开发依赖
- 在项目的开发阶段需要依赖,线上运营阶段不需要依赖的第三方包,称为开发依赖
- 使用npm install 包名命令将包添加到package.json文件的devDependencies字段中
项目运行依赖:npm install --production
package-lock.json文件的作用
- 锁定报的版本,确保再次下载时不会因为包版本不同而产生问题
- 加快下载速度,因为该文件中已经记录例如项目所依赖第三方的树状和包的下载地址,重安装时只需下载即可,不需要做额外工作
Node.js中模块加载机制