KK平台官方注册KK平台官方注册

KK体育官方客服
KK集团官方手机版

Node.js(day1)

1、什么是Node.js

Node.js Everywhere我们可以从官网的介绍来分析:node中文网 | node引文网

Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时。

浏览器引擎可以解析并执行js,google的v8引擎速度很快,所以node.js可以在脱离浏览器的情况下解析并执行js代码。我们平常所用的js为浏览器中的js,而node.js可以看做服务端的js,所以node.js不是一门新语言也非新框架,而是js运行时。可以简单的将node.js理解为使用js语言进行web服务器开发。(为了实现这些功能,node.js提供了一些特别的api)

node.js使用事件驱动、非阻塞I/O模型使得其轻量、高效。

node.js的包生态系统,npm是世界上最大的开源库生态系统。

绝大多数javascript包都存放在了npm上,以方便开发者安装使用。

2、Node.js能做什么

Web服务器后台命令行工具(如npm、git等都属于命令行工具,对于前端开发来说使用最多的也是node.js提供的命令行工具)

3、使用命令行解析js文件

写一个简单的js文件,

var str = "hello node";conole.log(str);

随意命名,比如hello.js。(注意,不能使用node.js命名,否则会打开文本而不会解析执行)然后在文件存放处打开命令行,使用node指令执行即可:

4、使用Node构建web服务器

我们已经知道Node可以解析js文件了,而js也可以进行web服务器搭建,所以我们只需要使用Node.js提供的相关api来搭建服务器,再用命令行去解析执行即可。

//类似我们需要使用某些对象一样,需要使用关键字进行New,在Node.js中我们使用require()方法进行模块加载(Node中的模块就相当于具有特殊功能的对象)//要构建一个web服务器需要使用http模块var http = require("http");//使用http模块创建webServervar server = http.createServer();//设置端口号server.listen(8888,function(){ console.log("端口号启用成功!");});//服务器request事件:请求时触发server.on("request",function(request,response){ console.log("已经收到请求!"+"请求路径为:"+request.url);//一些请求信息 response.write("雷好,我系~渣渣辉!");//响应 response.end("该干嘛干嘛去");//告知浏览器响应结束,不必等待});console.log("webServer at localhost://88888");

然后我们打开浏览器输入:localhost://8888或127.0.0.1://8888就可以访问了。总结一下:

Node.js的一些特殊功能,比如创建服务器,是普通js没有的,我们把这些具有特殊功能的对象称作模块,要使用这些模块,需要使用require()方法进行裁入。http模块可以创建服务器。使用createServer([options][, requestListener])方法可以创建并返回一个服务器对象,然后我们就可以进行相应设置。服务器的listen()方法为服务器设置端口号。服务器对象有很多事件,比如request事件在浏览器请求该服务器时触发,利用回调函数可以进行request处理和response响应。response.end()方法告知浏览器响应结束,否则浏览器会一直等待响应。响应数据只能是二进制数据或字符串。

5、Node.js中的JavaScript

EcmaScript(不包含BOM、DOM)核心模块第三方模块自定义模块

5.1核心模块

Node.js为JavaScript提供了很多服务器级别的api,这些api绝大多数都被包装到了一个具名的核心模块中,比如:文件操作的fs(File System)模块、http服务创建的http模块、路劲操作的path模块、操作系统信息的os模块等。而我们需要使用这些核心模块就需要使用require()方法进行获取。

5.2自定义模块

Node.js中的模块有三种:

具名的核心模块第三方模块自定义模块其中用户自定义的模块又叫文件模块,也就是那些js文件。我们知道,在命令行中node指令只能编译执行一个js文件,但是我们的项目不可能只有一个js文件,同样的,js文件也是模块,所以我们需要在某个文件中使用require()方法解析执行文件模块。比如我现在有以下三个js文件:

//a.js文件console.log("a start");require("./b.js");//解析执行b.jsconsole.log("a end");

//b.js文件console.log("b start");require("./c.js");//解析执行c.jsconsole.log("b end");

//c.js文件console.log("CCCCCC");

执行结果如下:

值得注意的点:

在Node.js中没有全局作用域,只有文件作用域。也就是说每个js文件的作用域都是分离的,互不影响。相对路劲必须写./;文件后缀可以省略。

既然每个文件中的变量互不影响,那么如果我们需要使用到某个文件内部的变量时又该如何获取呢?其实require()方法除了解析执行文件模块之外还能返回文件模块自带的exports对象,该对象默认为空{}。所以我们只需要在文件模块中将需要到处的值传入exports对象中即可:

var b = require("./b");//加载b文件console.log(b);//输出b模块导出的对象

var str = "雷好,我系渣渣辉";function add(x,y){ return x+y;}exports.str = str;exports.add = add;

执行:

6、响应内容的类型Content-Type

上文中我们响应的中文可能在浏览器中显示是乱码,这是因为Node.js默认的响应类型是utf-8,而浏览器不知道,如果浏览器默认编码不是utf-8就会产生乱码。response对象在响应的时候可以设置相关参数,比如响应头,响应内容的类型,而编码方式的信息就由Content-Type来设置。

//设置响应头参数。响应类型为普通文本,编码方式为utf-8response.setHeader("Content-Type","text/plain;charset=utf-8");

示例:

var http = require("http");var server = http.createServer();server.listen(8888);//服务器request事件:请求时触发server.on("request",function(request,response){ var url = request.url; var str = "<h1>如果你看得清我,说明我没有乱码!</h1>" if(url == "/plain"){ response.setHeader("Content-Type","text/plain;charset=utf-8");//返回普通文本 }else if(url == "/html"){ response.setHeader("Content-Type","text/html;charset=utf-8");//返回html文本 }else{ str = "please use url /plain or /html and get the response!" } response.end(str);});console.log("webServer running at localhost://88888");

7、fs核心文件

fs全称File System,用于操作文件,基本的两个功能为为读文件和写文件。

7.1使用fs读文件:readFile()

//使用require方法加载fs模块var fs = require("fs");fs.readFile("hello.js",function(error,data){ if(error){ console.log("文件读取失败!"); return; } console.log(data.toString());});使用fs的readFile()方法,第一个参数为文件地址,第二个参数为回调函数。回调函数有两个参数,error和data,当文件读取成功时,error返回null,data返回文件的二进制数据;当文件读取失败时,error返回包含错误信息的对象,data返回undefined。使用data.toString()方法可以讲二进制数据转化为utf-8编码字符串。

7.2使用fs写文件:writeFile()

var fs = require("fs");fs.writeFile("hello.txt","大噶好,I"m 渣渣辉",function(error){ if(!error){ console.log("文件写入成功!"); }else{ console.log("文件写入失败!"); }});使用fs.writeFile()方法写入文件。第一个参数为文件地址及文件名,第二个参数为文件的文本信息,可以是字符串,也可以是二进制数据,第三个参数为回调函数。

7.3案例:利用fs文件的读写操作实现文件复制

逻辑很简单,将读取的文件数据写入新的文件中即可

var fs = require("fs");fs.readFile("jinx.jpeg",function(error,data){ if(error){ console.log("文件读取失败!"); }else{ //将读取的数据写入新的文件中 fs.writeFile("jinx(copy).jpeg",data,function(error){ if(!error){ console.log("文件写入成功!"); }else{ console.log("文件写入失败!"); } }); } });

8、案例:使用Node加载index.html并实现简单页面跳转

由于文件过多这里不再展示,假设这是一个本地项目,

我们希望使用Node.js来搭建服务器,并在服务器上运行我们的项目。大家服务器很简单,关键点在于我们需要根据请求路劲来加载相应的资源文件,这些上面的案例都能实现。类似这样:

我们根据request.url使用fs核心模块来加载文件,并设置相应的Content-Type在浏览器中正确裁入文件类型。

openfile()是我自定义的一个方法。可以发现,这种加载资源的方式并不明智,我们每发起一次资源请求,例如一张图片,我们就需要配置依次资源路径,这是很繁琐且易错的。但目前为止上文所涉及的知识只能这样解决。所以需要继续升入,出门左转。

欢迎阅读本文章: 王宾程

KK体育备用主页

KK体育官方客服