Node.js

119 阅读4分钟

目录


  • 什么是Node
  • Node模块化
  • 安装
  • 创建Node.js应用
  • 搭建项目
  • express

什么是Node


  • Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。

  • 我们使用JS写的Node代码;

  • 事件驱动:当触发某个事件的时候,执行事件中指定的代码!

  • 非阻塞式 I/O 的模型:采用非阻塞的操作,能够提高处理的效率!

  • Node.js 的包管理器 npm,是全球最大的开源库生态系统。

  • 先使用npm init -y初始化一下包管理文件package.json,将来所有安装的包,都会记录到这个文件中

  • 使用npm install 包名 --save/--save-dev去安装包;其中,install可以简写成i;

  • --save表示把包安装到部署依赖中(在开发和部署上线都需要使用的包); --save-dev表示安装到开发依赖(只在项目开发阶段需要用到的包);

  • --save可以简写成-S--save-dev可以简写成-D;

  • npm uninstall 包名 --save/--save-dev或者npm remove 包名 --save/--save-dev

  • npm i 包名 -g,其中,-g表示全局安装某些包,通过-g安装的包都在C:\Users\用户名\AppData\Roaming\npm下面

Node模块化


核心模块

  • 什么是核心模块:官方,发现一些功能模块使用非常频繁,然后,官方把这些模块,编译成了二进制可执行文件,然后打包到了Node的安装包中;所以,这些核心模块就已经随着安装Node时候,被安装到了本地;
  • 如何使用核心模块 使用require(‘核心模块的名称’);

第三方模块

  • 什么是第三方模块:出了官方提供的好用的核心模块之外,我们程序员发现,还有一些使用也很频繁的代码和方法,一些牛逼的团体、个人、公司,开发出了好用的模块,通过NPM官网,托管出去,供其他人下载使用的这些模块;统称为第三方模块;
  • 如何使用第三方模块 - 通过moment这个第三方模块,来介绍如何使用一个第三方模块;
  • 第三方模块的使用方式:
  1. 先使用npm下载这个模块!【注意:在安装第三方模块的时候,安装的名字,就是你在require时候导入的名字】
  2. 使用require导入这个第三方模块!
  3. 通过官方文档,试着去使用这个第三方模块!
  4. 注意:无论是核心模块、还是第三方模块,都是通过 标识符名称来引用这个模块的!

用户模块

  • 什么是用户模块:程序员自己定义的JS文件,统统数据用户模块!
  • 推荐Node提供的exports

exports 和 module.exports

  1. 通过 module.exports 可以使用 . 的形式追加属性,也可以使用 等号 直接赋值的形式导出成员;
  2. exports 只能通过 . 的形式追加属性;不能使用 等号 直接赋值的形式!
  3. 注意: 在一个 module 中,最终向外暴露的成员,以 module.exports 指向的对象为准!

安装


官网:nodejs.org/en/

检查是否安装成功:node -v

创建Node.js应用


引入模块

var http = require("http");

编写代码

console.log('Node.js第一个程序')

运行文件命令:node 文件名

http -创建服务器

var http = require('http');

var server = http.createServer();

server.listen(3000, () => {
  console.log('创建成功');
});

fs -文件系统

var fs = require('fs');

fs.readFile(__dirname + '/views/index.html', function (err, data) {
   console.log(data.toString);
});

fs.writeFile(__dirname + '/views/index.html', '我是要写入的内容', function(err){
    if (err){
        console.log('写入失败')
    }
    console.log('写入成功')
 }

项目


  • 功能:登录检验、数据的增删改查
  • 使用的模块
// 模板引擎  $ npm install art-template
var template = require('art-template');
function (req, res) {
  let html = template(__dirname + '/views/login.html', {});
  res.end(html)
}

// 处理文件上传  $ npm install formidable
var formidable = require('formidable');
var form = new formidable.IncomingForm();
  form.uploadDir = __dirname + '/public/images';  // 图片保存的路径
  form.keepExtensions = true;   // 是否保留扩展名
  // 完成函数
  form.parse(req, function (err, fields, files) {
    if (err) {
      backInfo(err, res, '图片上传');
    }
    backInfo(null, res, '图片上传', path.basename(files.file.path));
  });

// 数据库  $ npm install mysql
var mysql = require('mysql');
var connection = mysql.createConnection({
  host: '127.0.0.1',        // 连接的服务器
  user: 'root',             // 用户名
  password: 'root',         // 密码
  database: 'heros'         // 连接的数据库名
})
connection.connect();       // 连接

express


  • 什么是Express.js:是一个基于Node.js的Web开发框架。Express框架并没有覆盖或删除原生的API,而是基于原生的API,做了进一步的封装,提供了更好用的一些API,方便快速进行Web开发!
  • 使用
// 下载
$ npm install express

// 引入
var express = require('express');

// 创建app
var app = express();
  • 原生node 与 express 的对比

http 的对比

// 原生node
var server = http.createServer();
server.listen(3001, () => {
  console.log('创建成功');
});
server.on('request', (req, res) => {
  router(req,res)
})

// express
var express = require('express');
var app = express();
app.listen(3000, function () {
  console.log('运行成功');
});

静态文件处理的对比

// 原生node
if (url.indexOf('/style') == 0 || url.indexOf('/js') == 0 || url.indexOf('/images') == 0) {
    ...
}

// express
app.use(express.static('public'));

获取post请求数据对比

// 原生node
function (req, res) {
  let str = '';
  req.on("data", chunk => {     //监听缓冲区中的数据,不断从缓冲区中获取数据
    str += chunk;
  })
  req.on("end", () => {          //监听数据是否获取完成
    console.log(str)
  })
  
 // express
 var bodyParser = require('body-parser');   // 下载: $ npm install body-parser
 app.use(bodyParser.urlencoded({extended:false}));   //解析 x-www-form-urlencoded
 app.use(bodyParser.json())   // 只解析json
 
 router.get('/',function (req,res){
    console.log(req.body);
 })
 

路由的对比

// 原生node
if (url === '/' && method == 'GET') {
    // 处理逻辑
}

// express
// 快速路由器
var express = require('express');
var router = express.Router();
router.get('/', function(req,res){});

模板引擎使用的对比

// 原生node
var template = require('art-template');
router.get('/',function (req, res) {
    let html = template(__dirname + '/views/index.html', { heros: data });
    res.end(html)
  })

// express
var template = require('express-art-template');
router.get('/',function (req,res){
    res.render(__dirname + '/views/index.html',{ heros: data })
})