nodeJS入门(一)
nodejs
1、Node.js 是基于ChromeV8 引擎的 JavaScript 运行环境。
2、Node.js使用了一个时间驱动,非阻塞式I/O的模型,使其轻量又高效
3、Node.js的包管理器npm,是全球最大的开源库生态系统。
优点:
1、使用JavaScript
2、速度非常快(v8引擎&non-block)
3、Node.js的包管理器npm,是全球最大的开源库生态系统。
学习nodejs什么
1、学习nodejs的工作原理。(v8引擎/模块/事件队列/文件系统)
2、搭建服务器(Express/路由/template)
3、实战项目(TodoApp)
学习之前掌握技术点
1、html+css
2、JavaScript
3、Command Line
开发工具:webstorm
第一节初识nodejs
console.log("hello!nodeJS"); //定时器 // var time = 0 // setTimeout(function () { // console.log("three seconds have pass") // },3000) // // var timer = setInterval(function () { // time +=2 // console.log(time+"seconds have pass") // if(time >6){ // clearInterval(timer) // } // },2000) //路径 console.log(__dirname);//不包含当前文件名 console.log(__filename);//包含当前文件名 //global //在js对象中全局对象是Windows,在nodejs中全局兑现格式global console.log(global) //nodejs基于V8引擎 // 1、电脑根本不识别也不理解JavaScript // 2、JavaScript引擎起到的作用是让电脑识别JS代码 //nodejs底层用的是c++写的,v8引擎是nodejs核心,c++写的 //关系 JavaScript - > v8 -> nodejs —> c++ —> 电脑
第二节module&require
新建文件夹modules,存放模块代码
var counter = (arr) =>"一共有多少个元素"+arr.length +"个元素在数组" var add = (a,b) => `a+b=${a+b}` //模块化 var pi = 3.142 module.exports.counter = counter; module.exports.add = add; module.exports.pi = pi;
在主JS中引用
//在nodejs中,文件与模块是一一对应的(每个文件被视为一个独立的模块) var obj = require("./modules/stuuf"); console.log(obj.counter([1,2,3,4,5])); console.log(obj.add(3,2)); console.log(obj.pi)
第三节事件模块
1、大部分的Node.js核心Api都是采用惯用的异步事件驱动架构(fs/http)
2、所有能触发事件的兑现都是EventEmitter类实例。
3、事件流程:引用模块->创建EventEmitter对象 ->注册事件 ->触发事件
//时间模块 //1、引入模块 const EventEmitter = require('events'); //2.创建EventEmitter对象 var myEmitter =new EventEmitter.EventEmitter(); //注册事件同步 myEmitter.on('A',function(a){ console.log("注册事件",a) }) //注册事件异步 myEmitter.on('B',(b) => { setImmediate(()=>{ console.log(b) }) }) //同步触发事件 myEmitter.emit('A','实现事件并传递此参数,同步'); //异步事件执行 myEmitter.emit('B','实现事件并传递此参数,异步'); console.log(1)
第四节文件系统
什么是文件系统
1、读取文件(fs.readFile)
2、写入文件(fs.writeFile)
3、流程:引入fs模块——>调用方法——>异常捕获
#2018-04-17更新
//引入模块 const fs = require("fs") //读取文件 //同步读取 //var a=fs.readFileSync("C:/Users/6092002639/Desktop/资料/多实例.txt","utf-8") //同步写入 //fs.writeFileSync("./多实例.txt",a); //异步步读取 fs.readFile("C:/Users/6092002639/Desktop/资料/多实例.txt","utf-8",function (err,data) { if (err) throw err; console.log(data) fs.writeFile("./大王叫我.txt",data,function (err,data) { if (err) throw err; }) }); console.log(123)
文件系统操作
1、创建文件夹(fs.mkdir)
2、删除文件夹(fs.rmdir)
3、删除文件(fs.unlink)
4、流程:引入js模块->调用方法->异常捕获
const f = require("fs") //删除文件 f.unlink('./modules/aaa.go',(err)=>{ if (err) throw err; console.log("successfully deleted /modules/aaa.go" ) }) //同步方法的例子: f.unlinkSync('./modules/aaa.go',(err)=>{ if(err) throw err; console.log("文件不存在") }); console.log('成功删除 /tmp/hello'); //创建文件夹 f.mkdir("./stuff",(err)=>{ if (err) throw err }) //同步创建 // f.mkdirSync("./stuff",(err)=>{ // if (err) throw err // }) //删除文件 f.rmdir("./stuff",(err)=>{ if (err) throw err }) //同步删除 f.rmdirSync("./stuff",(err)=>{ if (err) throw err })
第五节创建https
服务器与客户端的关系
1、创建服务
const http = require("http") //通过http模块,创建服务器 //创建服务器方法 const server = http.createServer(function (req,res) { console.log('客户端向服务器发送请求:'+req.url); res.writeHead(200,{"Content-type":"text/plain"}); res.end("server is working!") }); //服务对象监听服务器地址以及端口号 server.listen(8505,"0.0.0.0"); console.log("server is running");
2、缓存区及流
Buffer&Stream
//读写数据流 const fs = require("fs"); //读取文件流 var myReadStream = fs.createReadStream(__dirname+"/大王叫我.txt",'utf-8'); //写入文件流 var myWriteStream = fs.createWriteStream(__dirname+"/大王叫我大帅哥2.txt") // var time = 1 // myReadStream.on('data',(chunk)=>{ // console.log(`***********正在接受一部分数据,第${time}次**********`) // //写入数据,第一种方法 // myWriteStream.write(chunk) // time ++ // }); //第二种 写入方法 myReadStream.pipe(myWriteStream);
1>、实例写入到浏览器中
const http = require("http"); const fs = require("fs") var server = http.createServer((req,res)=>{ var myReadStream = fs.createReadStream(__dirname+"/大王叫我.txt","utf-8"); res.writeHead(200,{"Content-type":"text/plain"}) myReadStream.pipe(res) }); server.listen(8077,"0.0.0.0"); console.log("大王server is running---------------")
3、读取HTML&json数据
返回html
const http = require("http"); const fs = require("fs") var server = http.createServer((res,rep) => { rep.writeHead(200,{"Content-Type":"text/html"}) var html = fs.createReadStream(__dirname+"/index.html",'utf-8'); html.pipe(rep) }); server.listen(2018,"0.0.0.0")
返回json
var http = require("http"); var fs = require("fs"); var json ={"isOk":true,"data":"你大爷"} var server = http.createServer((res,rep)=>{ /****注意****/ //nodejs 请求的是两次 // / 与/favicon.ico //去掉 favicon 请求 if(res.url !=="/favicon.ico"){ rep.writeHead(200,{"Content-Type":"application/json"}) rep.end( JSON.stringify(json)) } }); server.listen(2018,"0.0.0.0")
4、路由
const http = require("http"); const fs = require("fs"); var server = http.createServer((res,rep) => { rep.writeHead(200,{"Content-Type":"text/html"}); //判断页面访问的地址 console.log(res.url) var html = ""; switch (res.url){ case "/": html = __dirname+"/index.html"; break case "/mian": html = __dirname+"/view/haha.html"; break case "/second": html = __dirname+"/view/heheh.html"; break case "/api/docs": rep.writeHead(200,{"Content-Type":"application/json"}); var data = [{"name":"Bucky","age":18},{"name":"Rose","age":18}]; rep.end(JSON.stringify(data)); return default: rep.end("空") return } console.log(html) var html = fs.createReadStream(html,'utf-8'); html.pipe(rep) }); server.listen(2018,"0.0.0.0");
第六节NPM
什么是npm?
Node Package Manger
1、NPM是随同NodeJs一起安装的包管理工具,类似python的pip,能解决Nodejs代码部署上的很多问题
常见的使用场景
1、允许用户从npm服务器下载别人编写的第三方包到本地使用
2、允许用户从npm服务器下载并安装别人编写的命令行程序到本地使用
3、允许用户将自己的编写的包或命令行程序上传到npm服务器供别人使用
步骤
1>、 安装模块
npm install <module package>
npmjs.com 为npm 官网
注意:npm 安装必须要有Package.json文件
可以使用命令 npm init
package.josn : 用于定义项目中所需要的各种模块,以及项目的配置信息(比如名称,版本,许可证等元数据)。