一、什么是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上,以方便开发者安装使用。

二、Node.js能做什么

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

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

写一个简单的js文件,

  1. var str = 'hello node';
  2. conole.log(str);

随意命名,比如hello.js。(注意,不能使用node.js命名,否则会打开文本而不会解析执行)

然后在文件存放处打开命令行,使用node指令执行即可:

四、使用Node构建web服务器

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

  1. //类似我们需要使用某些对象一样,需要使用关键字进行New,在Node.js中我们使用require()方法进行模块加载(Node中的模块就相当于具有特殊功能的对象)
  2. //要构建一个web服务器需要使用http模块
  3. var http = require('http');
  4. //使用http模块创建webServer
  5. var server = http.createServer();
  6. //设置端口号
  7. server.listen(8888,function(){
  8. console.log("端口号启用成功!");
  9. });
  10. //服务器request事件:请求时触发
  11. server.on('request',function(request,response){
  12. console.log("已经收到请求!"+'请求路径为:'+request.url);//一些请求信息
  13. response.write("雷好,我系~渣渣辉!");//响应
  14. response.end("该干嘛干嘛去");//告知浏览器响应结束,不必等待
  15. });
  16. 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()方法告知浏览器响应结束,否则浏览器会一直等待响应。
  • 响应数据只能是二进制数据或字符串。

五、Node.js中的JavaScript

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

1.核心模块

Node.js为JavaScript提供了很多服务器级别的api,这些api绝大多数都被包装到了一个具名的核心模块中,比如:

文件操作的fs(File System)模块、http服务创建的http模块、路劲操作的path模块、操作系统信息的os模块等。

而我们需要使用这些核心模块就需要使用require()方法进行获取。

2.自定义模块

Node.js中的模块有三种:

  • 具名的核心模块
  • 第三方模块
  • 自定义模块

    其中用户自定义的模块又叫文件模块,也就是那些js文件。

    我们知道,在命令行中node指令只能编译执行一个js文件,但是我们的项目不可能只有一个js文件,同样的,js文件也是模块,所以我们需要在某个文件中使用require()方法解析执行文件模块。

    比如我现在有以下三个js文件:
  1. //a.js文件
  2. console.log('a start');
  3. require('./b.js');//解析执行b.js
  4. console.log('a end');
  1. //b.js文件
  2. console.log('b start');
  3. require('./c.js');//解析执行c.js
  4. console.log('b end');
  1. //c.js文件
  2. console.log('CCCCCC');

执行结果如下:

值得注意的点:

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

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

所以我们只需要在文件模块中将需要到处的值传入exports对象中即可:

  1. var b = require('./b');//加载b文件
  2. console.log(b);//输出b模块导出的对象
  1. var str = '雷好,我系渣渣辉';
  2. function add(x,y){
  3. return x+y;
  4. }
  5. exports.str = str;
  6. exports.add = add;

执行:

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

上文中我们响应的中文可能在浏览器中显示是乱码,这是因为Node.js默认的响应类型是utf-8,而浏览器不知道,如果浏览器默认编码不是utf-8就会产生乱码。

response对象在响应的时候可以设置相关参数,比如响应头,响应内容的类型,而编码方式的信息就由Content-Type来设置。

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

示例:

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

七、fs核心文件

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

1.使用fs读文件:readFile()

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

2.使用fs写文件:writeFile()

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

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

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

  1. var fs = require('fs');
  2. fs.readFile('jinx.jpeg',function(error,data){
  3. if(error){
  4. console.log('文件读取失败!');
  5. }else{
  6. //将读取的数据写入新的文件中
  7. fs.writeFile('jinx(copy).jpeg',data,function(error){
  8. if(!error){
  9. console.log("文件写入成功!");
  10. }else{
  11. console.log("文件写入失败!");
  12. }
  13. });
  14. }
  15. });

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

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

我们希望使用Node.js来搭建服务器,并在服务器上运行我们的项目。

大家服务器很简单,关键点在于我们需要根据请求路劲来加载相应的资源文件,这些上面的案例都能实现。类似这样:

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

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

Node.js(day1)的更多相关文章

  1. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  2. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  3. Node.js:进程、子进程与cluster多核处理模块

    1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...

  4. Node.js:理解stream

    Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...

  5. Node.js:Buffer浅谈

    Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...

  6. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  7. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  8. Node.js入门(一)

    一.Node.js本质上是js的运行环境. 二.可以解析js代码(没有浏览器安全级的限制): 提供系统级的API:1.文件的读写 2.进程的管理 3.网络通信 三.可以关注的四个网站: 1.https ...

  9. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

随机推荐

  1. CSS网页布局

    注:优化样式表:增加css样式表的可读性 减伤样式重复 一.主要内容 1.布局分类;131   121 2.display属性排版 3.float属性排版(横向多列布局) 4.防止父类盒子塌陷 二.标 ...

  2. hashmap源码研究

    概述 在官方文档中是这样描述HashMap的: Hash table based implementation of the Map interface. This implementation pr ...

  3. python3 第三十一章 - 模块

    1.什么是模块 如果从Python解释器退出并再次输入,您所做的定义(函数和变量)将丢失.因此,如果要编写一个稍长的程序,最好使用文本编辑器为解释器准备输入,并以该文件作为输入运行它.这称为创建脚本. ...

  4. vue版 文件下载

    标签的download: 是HTML5标准新增的属性,作用是指示浏览器下载URL而不是导航到URL,因此将提示用户将其保存为本地文件. 这种是定义的接口不是下载文件的路径,而是通过API可以获得文件的 ...

  5. angular的json

    在angular从servlet中获取的list数据是字符串格式,需要转为json格式,于是使用语法: $scope.findOne=function(id){ typeTemplateService ...

  6. [html]CSS中的margin、border、padding区别

    图解CSS padding.margin.border属性W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层. ...

  7. python中os.path 与sys.path

    看别人写的代码,会发现两个和路径设置有关的模块 os 和sys.我对这两个模块也不是特别了解.只是记录一下自己看到的,学到的. python 中我们会使用这两个模块和文件路径, 创建文件 之类的 操作 ...

  8. 关于U3D的.SDK对接

    1,SDK对接原理:https://www.cnblogs.com/msxh/p/7220741.html 2,Unity ADS对接:https://blog.csdn.net/chenluwolf ...

  9. CoUninitialize引发的一个错误

    程序开始已使用CoUninitialize,后边的函数又再次调用CoUninitialize,判断返回值,导致函数提前退出返回异常.

  10. ffmpeg源码编译安装(Compile ffmpeg with source) Part 1 : 通用部分

    本页内容包含了在Unix/Linux中用源码包编译的通用的结构 可能不仅仅适用于ffmpeg 为啥使用源码包编译 编译源码可以扩展功能, 实现相对于自己平台的最优化, 还可以自定义的修改 概述 大部分 ...