Node.js 是运行在服务端的JavaScript。
Node.js 是一个基于Chrome JavaScript运行时建立的一个平台。
Node.js是一个事件驱动 I/O 服务端JavaScript 环境,基于Google的V8引擎,V8引擎执行Javascript 的速度非常快,性能非常好。
我们使用require 指令来载入 http模块,并将实例化的 HTTP赋值给变量http
var http = require("http")
接下来我们使用 http.createserver()方法创建服务器,并使用 listen方法绑定8888端口。函数通过request、response参数来接收和响应数据。
- //创建服务器
- http.createServer(function(requeest,response){
- }).listen(8888)
-
- //终端打印启动信息
- console.log('Server running at http://127.0.0.1:8888/')
- //引入http模块
- var http = require('http')
- //创建服务器
- http.createServer(function(request,response){
- //发送响应头
- response.writeHead(200,{'Content-Type':"text/plain"})
- //输出响应内容
- response.write("hello world")
- response.end()
- }).listen(8888)
- console.log('我的服务器已经启动,访问:http://127.0.0.1:8888');
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。
模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
方法一:
- 文件1:hello.js
-
- exports.world = function(){
- console.log("Hello Node.js");
- }
-
- 文件2:main.js
-
- //导入模块
- var hello=require('./hello')
- //调用hello中的方法
- hello.world()
方法二
- 文件1:hello.js
-
- function Hello(){
- let name;
- this.setName=function(theName){
- name=theName
- }
- this.sayHello=function(){
- console.log(`你好,${name}`);
- }
- }
- module.exports=Hello;
-
- 文件2:main.js
-
- //导入模块
- var Hello=require('./hello');
- let hello=new Hello();
- hello.setName("刘");
- hello.sayHello()
-
url.parse(urlStr[, parseQueryString][, slashesDenoteHost]):输入URL字符串,返回一个对象。
第二个参数为true时,使用querystring 来解析查询字符串。如果为true,query 属性将会一直赋值为对象,并且search属性将会一直是字符串(可能为空)。默认为false.
第三个参数为true,把//foo/bar当做{ host: 'foo',pathname: '/bar'},而不是( pathname : ' / /foo/bar'}。默认为false。
- const url = require('url')
-
- const reqUrl = 'http://user:pass@host.com:8080/p/a/t/h?query=string#hash';
- const urlObj = url.parse(reqUrl)
-
- // console.log(urlObj);
- // //获取当前url的端口
- // console.log(urlObj.port);
- // //获取主机
- // console.log(urlObj.host)
- //获取查询参数
- console.log(urlObj.query);
-
- //URL模块提供的方法
- const reqUrl="//foo/bar"
- const urlObj1 = url.parse(reqUrl,false);
- console.log(urlObj1.host,urlObj1.pathname);
-
- const urlObj2 = url.parse(reqUrl,false,true);
- console.log(urlObj2.host,urlObj2.pathname);
Node.js 异步编程的直接体现就是回调。
回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有API都支持回调函数
- 文件1:main.js
-
- const fs = require("fs")
- //阻塞代码(同步)
- let data = fs.readFileSync('./index.txt')
- console.log(data.toString());
- console.log("程序执行成功");
-
- //非阻塞代码(异步)
- //以上程序中 fs.readFile()是异步函数用于读取文件。如果在读取文件过程中发生错误,错误err对象就会输出错误信息。如果没发生错误,readFile跳过err对象的输出,文件内容就通过回调函数输出
- fs.readFile('./index.txt',function(err,data){
- if(err){
- console.error(err.stack);
- return
- }
- console.log(data.toString());
- })
- console.log("程序执行成功");
-
- 文件2:index.txt(根据自己的需要)
- 啥都好说就肯定会
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发。所以性能非常高。
Node.js的每一个API都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
Node.js基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。
6.1事件驱动程序
Node.js,使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动lO)|
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer) .
- //引入events模块
- const events = require("events")
-
- //实例化对象
- let eventEmitter = new events.EventEmitter()
-
- //on事件绑定
- eventEmitter.on("demo",function(){
- console.log("我是执行的方法--demo");
- })
-
- //emit触发事件
- eventEmitter.emit("demo")
- console.log("程序执行结束")
练习:
- var events = require("events")
- let eventEmitter = new events.EventEmitter()
-
- //定义connection事件
- let connectionHandler=function(){
- console.log("连接成功。。。");
- //触发其他事件data_recived
- eventEmitter.emit("data_recived")
- }
-
- //绑定connection事件
- eventEmitter.on("connection",connectionHandler)
-
- //绑定data_rectived事件
- eventEmitter.on("data_recived",function(){
- console.log("数据接收成功");
- })
- //触发connection事件
- eventEmitter.emit("connection")
- console.log("程序执行完毕");
jQuery怎样注册事件
1. $().click() 2. on("click",fn) 3. bind("click",fn) 4.live("click") 5. delegate("click")