目录
(把一系列相似功能的,封装到一个模块中,然后供使用)
node.js的开发是模块化开发的思想 具有一些相同功能的代码 集成为一个模块
模块主要是由: node系统自带的模块 、 第三方模块 、 自定义模块组成
第三方模块几乎都是由npm来管理 ==>npm是一个集成了当前世界上最多开源库的生态系统
nodejs环境中的全局函数:require() (window中的全局函数是global)
在前端中不用require,引用前端的js文件,用import
在后端运行时,引入第三方js文件,就用require() 也可以用import(es6语法)
import 是es6的语法 ==>导出 export defualt xxx
require是node能读懂的语法==>导出 moudel.exports={}
nodejs中有3种模块:
var fs=require("fs") // 内置模块 / 核心模块 node.js安装时,自己就装好了的模块
var mime=require("mime") //第三方模块,下载后使用 npm i mime
var myquerystring=require("./qureystring.js") //自定义模块
自定义模块,需导入导出:
在index.js目录中打开cmd小黑窗,执行 node indedx.js 会打印66666 和 网址
==>与import 的用法很相像
//导入:index.js文件中的内容 var myquerystring=require("./myquerystring.js") myquerystring.tool() console.log(myquerystring.url)
//导出:myquertstring.js文件中的内容 module.exports={ tool(){ console.log(6666666) }, url:"网址" } //如果里面没写内容,打出来就是一个空对象
笔试题:commonJS 中的 require/exports 和 ES6 中 import/export 的区别是什么
commonJS 中的 require/exports:
commonJS 模块的重要特性是 加载时执行,及脚本代码在 require 的时候,就会全部执行。一 旦出现某个模块被“循环加载”就只输出已经执行的部分,还没有执行的部分是不输出的。require可以用在函数、事件里面,跟懒加载相似ES6 中 import/export:ES6 模块是动态引用,如果使用 import 从一个模块加载变量,那些变量不会缓存,而是成 为 一个指向被加载模块的引用,import/export 最终都是编译为 require/exports 来执行的。 import它只能写在顶部、开始部分。
如果输入: require("fs1"),就会去相应的位置找:
1、先去当前项目中的node_modules文件夹中找fs1文件夹 中的package.json中main字段对应的路径,然后引用
2、没有就去node的安装包中的全局安装路径中找
(我自己设置的是node里面的golbal的node_modules里)
3、还是没有就去核心库
(nodejs中的node_modules的npm的node_modules)
例子1:(第三方模块==>自己下载)
1、在index.js中输入 var mime=require(“mime”)
2、经过上面三步都没有找到,就需要下载 : npm i mime --save
(i可以写全:install --save就下载到这个文件的内部,如果写-g就下载到全局)
3、在小黑窗指令输入后,在index.js同级目录层就会多两个文件:node_modules package-lock.json
4、这个时候node_modules中就有一个文件夹mime了
例子2:自定义模块
一般是写: var my1=require("./my1.js")
如果我写: var my2=require("my2")==>想让它代表一个文件夹,也不想它是自己的,就有两种方式下载:
1、将其传到 npm社区里,就可以用了
2、模仿上面下载mime后生成的文件 ==> 自己手动在node_modules里创建一个my2文件,然后在小黑窗输入: npm init ,然后一直敲回车 ,然后my2下就有package-lock.json生成,里面就有一个对象装着名字、版本、描述、作者等信息 (也可以不通过小黑窗,自己手动创建package-lock.json,写入那些信息)。同时需要在package-lock.json同级目录创建一个index.js,里面写导出。(!!!但是一般做项目不会在node_modules下创建文件夹写东西,一般都是下载)
注:
1、npm init这个指令,文件夹的路径必须是非中文的
2、npm init也可以写npm init -y 这样就不用敲回车了,就会直接生成文件夹package-lock.json。代表默认全部为yes
3、.json中不用 // 来写注释
提供项目中模块/插件的 下载相关功能
1、下载(常用)
npm i/install 模块名字/模块名字
npm i 模块名 //安装到本地
npm i 模块名 -g//安装到全局
npm i 模块名 --save//安装到项目依赖
1、npm i 模块名字x1 模块名字x2 模块名字x3 -g //把模块x1 x2 x3这个三个模块下载到全局安装路径
2、npm i 模块名字x1 模块名字x2 模块名字x3 或者
npm i 模块名字x1 模块名字x2 模块名字x3 --save
//把模块x1 x2 x3这个三个模块下载到项目安装路径(就是当前项目内部 的node_modules)
3、下载了第三方模块后 npm会在项目配置文件中的依赖项中写入下载的第三方模块名和版本
4、 npm i :按照package.json(配置文件夹)项目清单,把所有的依赖项全部下载出来
5、npm -v 看版本
6、 npm run dev:小黑窗的指令==> 就是运行当前文件里面的package.json里面的script字段里面的dev指令 ("dev" : "node index.js")
2、更新/删除
npm update 模块名 //帮你更新到最新版本 npm update 模块名@版本 //帮你更新到指定版本 npm uninstall 模块名 //删除模块
项目的配置文件 用于记录整个项目的一些信息
(比如:项目名、作者信息、"scripts":{"dev":"node index.js"} ==>启动指令 ==>主要用于小黑窗的npm启动 npm run dev 、"dependencies" ==>项目依赖)
每一个项目 构建时 先构建一个package.json文件 它代表了这个项目的一些结构和配置信息(项目的清单)
构建指令: 在项目文件夹下 npm init -y 初始化一个项目清单文件 npm i 是按照项目清单文件去安装所有的依赖项
1、main字段 ==> 项目入口
2、scripts字段 ==>cmd的指令
3、dependencies字段 ==>当项目中需要依赖,比如axios工具 (npm i axios),就会在这个字段中做记录==>为了以后把node_modules删除了,可以下载回来 (npm i)
dependencies翻译为依赖项
丢包:比如在下载mime的时候,几万个文件在过程中,因为网络原因、网络波动等,有几个没下就是丢包。
解决方案:将mime删除,重新下载(npm i mime)。也可以不删,直接再下一次。一般是删除了重新下载
前端刷新页面有两种技术:
1) 整页面刷新: 重新 跳转到一个新的网页html
2) 局部刷新 : 网页不变,依然是我原本的html文件。用js去做网络请求 ,然后请得到的数据 动态的渲染的DOM (添加到页面) ==> AJAX技术
==> 其中:
1、可以点击刷新:写一个button,然后点击就运行一个函数。
2、也可以直接页面加载就刷新:将代码写在winodw.onload里面
这个网络请求的技术是AJAX,AJAX是一个技术,将这个技术封装到window对象的一个方法(XMLHttpRequest==>构造函数)里面==> window.XMLHttpRequest ,它是全局变量,所以把window去掉
笔试题:
手写原生AJAX的代码,就是下面index.js文件中的代码
前端index.js文件
(xhr.status==200 如果不写,默认是200)
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <button onclick="load1()">ajax请数据button>
- <script>
- // 前端刷新页面有两种技术:
- // 整页面刷新 跳转到一个新的网页html
- // 局部刷新 用js去做网络请求 然后请得到的数据 动态的渲染的DOM
- function load1(){
- //AJAX技术 ==>window.XMLHttpRequest
-
- //1.创建ajax对象 (创建一个能做网络请求的对象)
- let xhr=new XMLHttpRequest()||new ActiveXObject("Microsoft.XMLHTTP") //兼容性写法 ,前面是现代浏览器的写法
-
- //2.配置连接信息 ==> 请求方式是GET还是POST,以及要请求公司的网址url(绝对网络路径、相对网络路径(常用)都可以)和 是否异步请求,默认是true
- xhr.open("GET",`http://192.168.6.60:8080/ajax1?name=karen&count=20`,true)
-
- //3.发送网络请求 括号里只能填字符串,字符串不会发给后端,只有上面是POST的时候,菜发给后端
- xhr.send()
-
- //4.等待
- //xhr对象里有一个readyState属性,用来监听管道
- //1:与其它电脑连接,并且连上了,建立了连接
- //2:后端正在处理信息
- //3:重新连另外一个管道了
- //4:后端将数据发过来了,我可以收了
- while(xhr.readyState!=4){} //就可以写一个while循环,一直判断是否等于4。
- //如果不等于4,就死循环,下面的代码就不会运行,这就相当于同步了,所以不好。因此就有了下面这个事件:
- xhr.onreadystatechange=function(){ //让这个对象监听onreadystatechange这个属性,只要这个属性改变了,它就会调用这个函数
- console.log(xhr.readyState)
- if(xhr.readyState==4&&xhr.status==200){ //xhr.status代表状态码,可以代表数据(业务)是否正确,由程序员来设定等于多少就正确或者错误
- //比如我现在前端设定的是200的状态码,那这个就是正确的数据/业务
- console.log(xhr.responseText) //xhr.responseText表示后端发过来的数据
- }else if(xhr.readyState==4&&xhr.status==404){ //xhr.readyState==4就代表网络请求成功 404不代表网络请求失败
- console.log(xhr.responseText)
- var obj=JSON.parse(xhr.responseText) //将json数据转换为对象,供后面使用
- console.log(obj)
- }
- }
- }
- script>
- body>
- html>
后端index.js文件
- var http=require("http")
- var fs=require("fs")
- var url=require("url")
- var querysting=require("querystring")
- var mime=require("mime")
- var app=http.createServer((req,res)=>{
- let pathname=url.parse(req.url).pathname
- fs.readFile(__dirname+"/src"+pathname,(err,data)=>{
- if(!err){
- res.setHeader("content-Type",mime.getType(pathname))
- res.end(data)
- }else if(pathname=="/ajax1"){
- res.writeHead(200,{"content-Type":"text/json"}) //200是自己写的状态码
- res.end('{"name":"karen","age":20}') //'{"name":"karen","age":20}'这是Json数据
- }else{
- res.setHeader("content-Type","text/json")
- res.end("404 没有找到")
- }
- })
- })
- app.listen(8080)
这个MVC框架不需要自己设计,后面可以直接使用框架
M:Model 数据模型层
V:View 试图层
C:Controller 逻辑控制层
因为代码很多,就需要分类进行写,使用模块化的思想,就分为MVC这三类进行写代码
会使用框架
index.js
- var http=require("http")
- var router=require("./router.js")
- var controller=require("./controller.js")
- var controller2=require("./controller2.js")
- http.createServer(router).listen(8080)
- //静态托管
- router.static(__dirname+"/src")
- //注册
- router.get("/login",controller.fm)
- router.get("/register",controller.register)
- router.get("/register2",controller2.register2)
- router.get("/ajax1",controller2.fn)
router.js
- var fs=require("fs")
- var url=require("url")
- var querysting=require("querystring")
- var mime=require("mime")
- let urls={}
- let router=function(req,res){
- //这个函数每次用户访问时运行
- let pathname=url.parse(req.url).pathname
- fs.readFile(router.basepath+pathname,(err,data)=>{
- if(!err){
- res.setHeader("content-Type",mime.getType(pathname))
- res.end(data)
- }else{
- if(!urls[pathname]){res.end("404 not found-mymvc")}
- else{urls[pathname](req,res)}
- }
- })
- }
- //这个比上面那段代码还先执行
- router.static=function(path){
- this.basepath=path
- }
- router.get=function(url,cb){
- urls[url]=cb
- }
- router.basepath=__dirname+"/public"
- module.exports=router;
controller.js
- module.exports={
- ajax1(req,res){},
- ajax2(){},
- fn(){},
- fm(req,res){
- res.end("login success6666 今天结束了")
- },
- register(req,res){
- res.end("6666")
- }
- }
Tip:
JSON中对象转字符串,后面可以填5个基本数据
var str=JSON.stringify(arr)