1.前端最主流的JavaScript运行环境

1>Node.js是一个基于Chrome V8引擎的JavaScript运行环境。
2>Node.js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效。
3>Node.js的包管理器npm,是全球最大的开源库生态系统。

2.工作原理

V8引擎
模块
事件队列
文件系统
...

3.V8引擎

引擎:电脑根本不识别也不理解JavaScript,JS引擎的作用是使电脑能够识别JS代码
NodeJS是使用C++写的
V8引擎是Node.js的核心
V8引擎的作用就是让JS代码能够被电脑识别

4.Module & Require

```
stuff.js
var adder = function(a,b){
var result = `结果是:${ a + b }`;
return result;
}
var PI = 3.14; module.exports = {
adder: adder,
PI: PI
} main.js
var stuff = require("./stuff");
stuff.adder(10,stuff.PI);
```

5.事件模块 Events

1>大多数Node.js核心API都是采用惯用的异步事件驱动架构(fs/http)
2>所有能触发事件的对象都是EventEmitter类的实例
3>事件流程:引入模块——创建EventEmitter对象——注册事件——触发事件 ```
eg:
const EventEmitter = require("events"); //引入事件模块
class MyEmitter extends EventEmitter{}; //创建EventEmitter对象
const myEmitter = new MyEmitter(); //var myEmitter = events.EventEmitter();
myEmitter.on("someEvent",(msg)=>{ //注册事件
setImmediate(function(){ //IE,把一个需要长时间运行的操作放在一个回调函数里,在浏览器完成后面的其他语句后,就立即执行这个回调函数
console.log(msg);
});
});
myEmitter.emit("someEvent","实现事件并传递此参数到注册事件的回调函数中"); //触发事件
```

6.文件系统

读取文件 fs.readFile
写入文件 fs.writeFile
流程:引入fs模块——调用方法——异常捕获 ```
eg: var fs = require("fs");
var readMe = fs.readFileSync("readMe.txt","utf8"); //同步读取文件
fs.writeFileSync("writeMe.txt",readMe); //同步写入
fs.readFile("readMe.txt","utf8",function(err,data){ //异步读取文件
if(err){
throw err;
}
console.log(data);
fs.writeFile("writeMe2.txt",data); //异步写入
}) const fs = require("fs");
//删除文件
fs.unlink("writeMe2.txt",function(err){
if(err){
throw err;
}
console.log("文件删除成功");
});
//创建文件夹同步
fs.mkdirSync("stuff");
//删除文件夹 同步
fs.rmdirSync("stuff");
//异步创建文件夹
fs.mkdir("stuff",function(){
fs.readFile("readMe.txt","utf8",function(err,data){
if(err){
throw err;
}
fs.writeFile("./stuff/writeMe.txt",data);
})
})
//异步删除文件夹——先删除文件,再删除外部文件夹
fs.unlink("./stuff/writeMe.txt",function(){
fs.rmdir("stuff",function(err){
if(err){
throw err;
}
console.log("文件夹删除成功");
});
});
```

7.Http创建服务器

通过Http模块搭建本地服务器

```
const http = require("http");
//创建本地服务器
var srv = http.createServer((req,res)=>{
res.writeHead(200,{"Content-Type":"text/plain"});
res.end("Server is working!");
});
//监听本地端口
srv.listen(8888,"127.0.0.1",()=>{ });
srv.on("upgrade",(req,socket,head)=>{
socket.write('HTTP/1.1 101 Web Socket 协议握手\r\n' +
'升级:WebSocket\r\n' +
'连接:升级\r\n' +
'\r\n'
);
socket.pipe(socket);
});
```

8.缓存区 & 流

缓存区:Buffer,可以在TCP流和文件系统操作等场景中处理二进制数据流。
Buffer,全局对象,无需单独引入。
流:Stream, NodeJS中处理流数据的抽象接口
1>读写数据流 ```
const fs = require("fs");
//读取文件流
var myReadStream = fs.createReadStream(__dirname + "/readMe.txt","utf8");
//后台服务器自动触发
myReadStream.on("data",function(chunk){
console.log("=======正在接收一部分数据======");
console.log(chunk);
}); //写入文件流
var myWriteStream = fs.createWriteStream(__dirname + "/writeMe.txt");
var time = 0;
myReadStream.on("data",function(chunk){
time++;
console.log("=======正在接收" + time + "一部分数据======");
myWriteStream.write(chunk);
}); //输出到浏览器
var http = require("http");
var fs = require("fs");
var server = http.createServer(function(req,res){
if(req.url != "/favicon.ico"){ //防止发送favicon的请求
res.writeHead(200,{"Content-type":"text/html"});
var myReadStream = fs.createReadStream(__dirname + "/index.html","utf8");
} });
server.listen(3000,"127.0.0.1");
console.log("Server is running ...");
``` 2>读取HTML & JSON ```
res.writeHead(200,{"Content-type":"text/plain"});
res.writeHead(200,{"Content-type":"text/html"});
res.writeHead(200,{"Content-type":"application/json"});
```

9.路由Route

```
var http = require("http");
var fs = require("fs");
var server = http.createServer(function(req,res){
if(req.url !== "/favicon.ico"){
//判断用户所访问的页面地址
if(req.url == "/home" || req.url == "/"){
res.writeHead(200,{"Content-type":"text/html"});
fs.createReadStream(__dirname + "/index.html").pipe(res);
}else if(req.url == "/contact"){
res.writeHead(200,{"Content-type":"text/html"});
fs.createReadStream(__dirname + "/contact.html").pipe(res);
}else if(req.url == "/api/docs"){
var data = [{name:"Henny",age:"30"},{name:"Jack",age:"28"}];
res.writeHead(200,{"Content-type":"application/json"});
res.end(JSON.stringify(data));
}
}
});
```

10.NPM

Node Package Manager
Package.json
用于定义项目中所需要的各种模块,以及项目的配置信息(比如版本名称、版本、许可证等元数据) npm install ** -g
npm install ** --save
npm install ** --save -dev
npm uninstall **

11.Express框架和nodemon

Express框架
已经封装好服务器
已经封装好路由
已经封装好中间件
已经封装好网络请求...
NPM安装Express框架——引入Express模块——实例化Express的对象——通过对象调用各种方法 ```
//引入express模块
var express = require("express");
//实例化express对象
var app = express();
//通过对象调用对应的方法
app.get("/",function(req,res){
console.log(req.url);
res.send("This is home page!");
res.sendFile(__dirname + "/index.html");
});
app.get("/contact",function(){
console.log(req.url);
res.send("This is contact page!");
});
//路由参数
app.get("/profile/:id",function(req,res){
res.send("您所访问的路径参数为:" + req.params.id);
});
//监听服务器端口号
app.listen(8888);
```

12.EJS模板引擎

特点:
快速编译和渲染
简单的模板标签
支持浏览器端和服务器端
支持express视图系统 ```
npm install ejs --save -dev //引入express模块
var express = require("express");
//实例化express对象
var app = express();
//配置视图引擎为EJS
app.set("view engine","ejs");
//通过对象调用对应的方法(响应html文件)
app.get("/",function(req,res){
console.log(req.url);
res.sendFile(__dirname + "/index.html");
});
//返回ejs文件用render而非sendFile
app.get("/contact",function(){
console.log(req.url);
res.render(__dirname + "/contact.html");
});
//路由参数
app.get("/profile/:id",function(req,res){
res.render("profile",{ websiteName:"hello world!" }); //自动找到views下的profile.ejs
});
app.get("/profile/:id",function(req,res){
var data = {age:29,name:"Henry"};
//var data = [{age:29,name:"Henry"},{age:30,name:"Jack"}]
res.render("profile",{ websiteName:req.params.id },data:data); //自动找到views下的profile.ejs
});
//监听服务器端口号
app.listen(8888); views/profile.ejs
<h1>EJS模板:Welcome To <%= websiteName %> page! </h1>
<p><strong>Name:</strong> <%= data.name %></p>
<p><strong>Age:</strong> <%= data.age %></p>
<ul>
<% data.forEach(function(item){ %>
<li><%= item %></li>
<% })%>
</ul>
```

13.公共模板

使用EJS替代HTML(根据模板引擎确定)
创建导航(公共模板)
解决外部样式不可用的问题(外部样式表无法在服务中运行) ```
public/nav.ejs (模板文件只能有一个根标签)
<nav>
<ul>
<li><a href="/">主页</a></li>
<li><a href="/contact">联系</a></li>
</ul>
<nav> views/contact.ejs
<body>
<% include ../public/nav.ejs %>
<h1>Welcome to 联系我们页面!</h1>
<p>电话:40080000</p>
</body> //让服务器识别外部样式表(使用use中间件)
app.use("/assets",express.static("assets"));
```

NodeJS基础入门的更多相关文章

  1. 02 nodejs命令参数(NodeJS基础入门)

    声明:本文章可供有一定js基础的朋友参考nodejs入门,本文未讲解nodejs的安装,如有需要的同学可以加QQ3382260752找我,进行交流学习. 建议使用开发软件:webstorm或hbuil ...

  2. 边走边学Nodejs (基础入门篇)

    1.什么是Node.js Nodejs ,或者node, 是一个基于ChromeJavaScript执行时建立的平台.用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非堵 ...

  3. NodeJS基础入门-fs文件系统

    文件I/O是由简单封装的标准POSIX函数提供.通过require('fs') 使用该模块.所有的方法都有异步和同步的形式. 异步方法的最后一个参数都是一个回调函数.传给回调函数的参数取决于具体方法, ...

  4. NodeJS基础入门-Event

    大多数Node.js核心API都采用惯用的异步事件驱动架构,其中某些类型的对象(触发器)会周期性地触发命名事件来调用函数对象(监听器). 例如,net.Server对象会在每次有新连接时触发事件;fs ...

  5. NodeJS基础入门-Buffer

    Buffer.byteLength console.log(Buffer.byteLength('test')); console.log(Buffer.byteLength('我是C语言爱好者')) ...

  6. Mongoose基础入门

    前面的话 Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具.本文将详细介绍如何使用Mongoose来操作MongoDB NodeJS驱动 在介绍Mongoose之 ...

  7. Elasticsearch 基础入门

    原文地址:Elasticsearch 基础入门 博客地址:http://www.extlight.com 一.什么是 ElasticSearch ElasticSearch是一个基于 Lucene 的 ...

  8. nodejs 基础篇整合

    nodeJs 基础篇整合 最近有朋友也想学习nodeJs相关方面的知识,如果你是后端想接近前端,node作为一门跑在服务端的JS语言从这里入门再好不过了.如果你正好喜欢前端,想走的更高,走的更远.no ...

  9. ECMAScript 6.0基础入门教程

    ECMAScript 6.0基础入门教程 转:https://blog.csdn.net/hexinyu_1022/article/details/80778727 https://blog.csdn ...

随机推荐

  1. 闲里偷忙的CPU-某个kwoker进程忙

    https://zhuanlan.zhihu.com/p/34311472 有一类比较特殊的CPU使用率问题,这类问题的特点是,系统平均CPU使用率很低,但是个别CPU的使用率非常高.今天借助这个真实 ...

  2. 性能测试工具Jmeter08-Jmeter断言(检查点)

    断言是在请求的返回层面增加一层判断机制.因为请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性. 下面介绍常用的jmeter三种断言 1.响应断言 例如: 模式匹配规则 2.Size A ...

  3. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  4. 二叉排序树思想及C语言实现

    转自: http://blog.chinaunix.net/uid-22663647-id-1771796.html 1.二叉排序树的定义 二叉排序树(Binary Sort Tree)又称二叉查找( ...

  5. LayUI&前端问题汇总

    1.用JS获取地址栏参数的方法 采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) //通过data给form赋值,根据name赋给value $.fn.setForm = function ...

  6. 集成Springboot+MyBatis+JPA

    1.前言 Springboot最近可谓是非常的火,本人也在项目中尝到了甜头.之前一直使用Springboot+JPA,用了一段时间发现JPA不是太灵活,也有可能是我不精通JPA,总之为了多学学Spri ...

  7. Hibernate多对多删除问题的解决

    原出处:http://superleo.iteye.com/blog/154587 Hibernate多对多的例子不少,但仔细一看,大多数都是保存的,删除谈的少,但问题还不少,因此有必须简单测试一下, ...

  8. $.ajax显示进度条

  9. tomcat启动部署APP报错:This is very likely to create a memory leak

    This is very likely to create a memory leak的错误,网上很多,原因也是各种各样,这里也仅提供一个解决的思路. 问题描述:启动tomcat时,不能访问部署的AP ...

  10. angularjs ng-if 慎用 备忘

    ng-if.ng-show一般情况下可以通用,二者的最明显区别就是: ng-if判断为false时,页面dom节点不会被创建,其子节点下也不会渲染,从而也就加快了dom的加载速度:ng-show则仅是 ...