前言
Node的介绍
Node是一个服务端的Js库,他里面包含了多个模块,以及环境资源非常充足。我们可以通过各种模块的调用来实现对应的功能,他里面包含了俩个重点内容 一个为node 他是用于执行js代码的。一个为npm 他是用于管理对应的模块的(facebook出了一个yarn)。
模块是什么
在js中一个文件就是一个模块,多个小模块构成一个大的模块。模块的拆分主要针对的是代码的复用性,及组装的简便性。
在es6中我们对应的就存在了模块的概念 以及我们提供了对应的修饰符来操作模块
一个模块必须先导出 才能导入使用
模块导入
import 变量名 from "模块地址"
模块的导出
exprot 变量名
默认导入为
exprot default 变量名
在node中模块的导入导出使用 module(commonjs)
导出
module.exprots = 对应的内容
导入
const 变量名 = require('地址')
模块的导入有三种方式(了解)
AMD
AMD “异步模块定义”。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。主要用于浏览器端的JS加载,为了不造成网络阻塞。只有当依赖的模块加载完毕,才会执行回调。
AMD使用define来定义模块,require来加载模块。
define(id?,dependencies?,factory);
require([module],callback);
CMD
Common Module Definition的缩写,也是一种异步模块定义规范,它和AMD的主要区别有两点:
1.对于模块的依赖,AMD是提前执行,CMD是延时执行。
2.AMD推崇依赖前置,CMD推崇就近依赖。
//AMD
define(['./a','./b'], function (a, b) {
//依赖一开始就写好
a.test();
b.test();
});
//CMD
define(function (requie, exports, module) {
//依赖就近书写
var a = require('./a');
a.test();
});
UMD
UMD: 通用模块规范
从名字就可以看出来UMD做的是大一统的工作,把前后端加载糅合在了一起,提供了一个前后端统一的解决方案。既然CommonJs和AMD风格一样流行,似乎缺少一个统一的规范,支持AMD和CommonJS模式。
UMD的实现原理:
1.先判断是否支持Node.js模块格式(exports是否存在),存在则使用Node.js模块格式。
2.再判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。
3.前两个都不存在,则将模块公开到全局(window或global)
commonjs与ES6的module还是有很⼤区别的:*
1. 两者的模块导⼊导出语法不同,commonjs是module.exports,exports导出,require导⼊;ES6则是export导出,import导⼊。
2. commonjs是运⾏时加载模块,ES6是在静态编译期间就确定模块的依赖。
3. ES6在编译期间会将所有import提升到顶部,commonjs不会提升require。
4. commonjs导出的是⼀个值拷贝,会对加载结果进⾏缓存,⼀旦内部再修改这个值,则不会同步到外部。ES6是导出的⼀个引⽤,内
部修改可以同步到外部。
5. 两者的循环导⼊的实现原理不同,commonjs是当模块遇到循环加载时,返回的是当前已经执⾏的部分的值,⽽不是代码全部执⾏后
的值,两者可能会有差异。所以,输⼊变量的时候,必须⾮常⼩⼼。ES6
模块是动态引⽤,如果使⽤import从⼀个模块加载变量(即import foo from
‘foo’),那些变量不会被缓存,⽽是成为⼀个指向被加载模块的引⽤,需要开发者⾃⼰保证,真正取值的时候能够取到值。
6. commonjs中顶层的this指向这个模块本⾝,⽽ES6中顶层this指向undefined。
7. 然后就是commonjs中的⼀些顶层变量在ES6中不再存在:
Node基本构成
JavaScript的构成
DOM (文档操作)
BOM (浏览器操作)
ES(ECMAScript)语法
Node的构成
语法 (ES3、ES5、ES6)
全局变量(global)
内置模块
http、url、path、fs、events…
入门模块
http模块
//common.js导入
const http = require('http')
//创建一个服务 前后端交互的
http.createServer((req,res)=>{
res.end('hello')
}).listen(12345)
console.log('服务器已经启动');
运行
node http.js
fs模块(fileSystem 文件系统)
负责文件的增删改查
添加
//导入
const fs = require("fs")
//创建文件夹
fs.mkdir('./dir',function(err){
if(err) throw new Error()
console.log("创建成功");
})
//创建文件
fs.appendFile('./dir/text','hello.js',function(err){
if(err) throw new Error()
console.log('hello');
})
查询
fs.readFile('./bg.png',function(error,data){
if(error) throw new Error()
//写入内容
fs.writeFile('./bg1.png',data,function(err,res){
if(error) throw new Error()
console.log('写入成功');
})
})
//如果我想读取文件夹里面的所有内容 递归
fs.readdir('./dir',function(err,files){
if(err) throw new Error()
console.log(files);
})
拷贝
//文件copy方法
fs.copyFile('./bg1.png','./bg2.png',function(err){
if(err) throw new Error()
console.log('拷贝成功');
})
// 重命名
fs.rename('./bg.png','./hello.jpg',function(err){
if(err) throw new Error()
console.log('重命名成功');
})
删除
fs.rm('./hello.jpg',function(err){
if(err) throw new Error()
console.log('删除成功');
})
fs.rmDir('./dir',function(err){
if(err) throw new Error()
console.log('删除成功');
})
//删除文件
fs.unlink('./hello.jpg',function(err){
if(err) throw new Error()
console.log('删除成功');
})
HTTP模块(接收http请求的服务端模块)
//服务端的主要代码
const http = require('http')
//创建一个服务
http.createServer((req,res)=>{
res.end()
}).listen(5000,function(){
console.log('服务器已经启动');
})
引入路由的概念(根据访问地址的不同 来访问不同的接口 url模块)
//服务端的主要代码
const http = require('http')
const url = require('url')
//创建一个服务
http.createServer((req,res)=>{
// console.log(url.parse(req.url).pathname);//获取/后的地址
let router = url.parse(req.url).pathname //路由地址
//响应对象 res 请求对象 req
res.setHeader('Content-type','application/json;charset=utf-8') //设置响应头
res.setHeader('Access-Control-Allow-Origin',"*") //跨域的请求头
switch(router){
case "/login":
res.write('登录')
break;
case "/register":
res.write('注册')
break;
case "/findUser":
res.write('查找用户')
break;
default:
}
res.end()
}).listen(5000,function(){
console.log('服务器已经启动');
})