本项目重点内容
- Node基础 — 通过对Node基础的了解学习,打下Node基础
- NodeAPI — 开启服务提供API给前端调用
- Node连接MySQ L— 通过node操作数据库,实现增删改查的功能
- Node实战 — 个人博客从零开始,打造首页、作者主页、博客详情页、登录页、新建页、编辑页
- Node框架express重构博客项目
目录
一、Nodejs和JavaScript的区别
只定义语法标准
二、commonjs
- 什么是commonjs
CommonJS 就是为 JS 的表现来制定规范,因为 JS 没有模块系统、标准库较少、缺乏包管理工具,所以 CommonJS 应运而生,它希望 JS 可以在任何地方运行,而不只是在浏览器中,从而达到 Java、C#、PHP 这些后端语言具备开发大型应用的能力。
- commonjs的应用
- 服务器端JavaScript应用程序
- 命令行工具
- 图形界面应用程序
- 混合应用程序(如,Titanium或Adobe AIR)
- CommonJS 与 Node.js 的关系?
CommonJS 就是模块化的标准,Node.js 就是 CommonJS(模块化)的实现。
- Node.js 中的模块化?
在 Node 中,模块分为两类:一是 Node 提供的模块,称为核心模块;二是用户编写的模块,成为文件模块。核心模块在 Node 源代码的编译过程中,编译进了二进制执行文件,所以它的加载速度是最快的,例如:HTTP 模块、URL 模块、FS 模块;文件模块是在运行时动态加载的,需要完整的路劲分析、文件定位、编译执行过程等……所以它的速度相对核心模块来说会更慢一些。
我们可以将公共的功能抽离出一个单独的 JS 文件存放,然后在需要的情况下,通过 exports 或者 module.exports 将模块导出,并通过 require 引入这些模块。
CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}
require()用来引入外部模块;exports对象用于导出当前模块的方法或变量,唯一的导出口;module对象就代表模块本身。
- 模块化的使用
现在,我们通过三种使用方式,来讲解下 Node 中的模块化及 exports/require 的使用。
方法一:
tool-add.js
//1.定义一个工具模块 该模块有add方法
var tools={
add:(...number)=>{
let sum =0;
for(let number in number){
sum += number[number];
}
return sum
}
}
// 2. 暴露模块
module.exports=tools;
//语法解析:
//var str="xiao jia"
// exports.str=str; //{str:'xiao jia'}
// module.exports=str;
// 二者都可以暴露 区别:
// module.exports是真正的接口 exports是一个辅助工具
// 如果module.exports为空,name所有的exports收集到的属性和方法,都赋值给了module.exports
// 如果module.exports具有任何属性和方法 则exports会被忽略
// 模块内的exports:为了方便,node为每个模块提供一个exports变量,其指向module.exports,
// 相当于在模块头部加了这句话:var exports = module.exports,在对外输出时,可以给exports对象添加方法,
// PS:不能直接赋值(因为这样就切断了exports和module.exports的联系);
那么,上面的代码有啥含义呢?
第一步,我们定义了个工具库 tools
。
第二步,我们通过 modules.exports
将 tools
进行了导出。
所以,我们在 CommonJS.js
可以通过 require
导入使用:
var http=require ("http");
var tools1=require('./tool-add.js');
http.createServer(function (req,res){
res.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"});
res.write('<h1>hello world</h1>')
})
console.log(tools1.add(1,2,3)); //6
通过以上代码我们完成了exports和require的初次使用
方法二
当我们模块文件过多的时候,应该需要有个存放这些模块的目录,Node 就很靠谱,它规范我们可以将这些文件都放在 node_modules
目录中(大家都放在这个目录上,就不会有其他乱七八糟的命名了)。
所以,我们在 node_modules
中新建一个 tool-multiply.js
文件,其内容如下:
// 定义一个工具模块 该模块有multiply方法
var tools={
multiply:(...number)=>{
let sum =0;
for(let number in number){
sum *= number[number];
}
return sum
}
}
// 暴露模块
module.exports=tools;
在引用方面,我们只需要通过:
// 如果 Node 在当前目录没找到 tool.js 文件,则会去 node_modules 里面去查找
var tools2 = require('tool-multiply');
console.log(tools2.multiply(1, 2, 3, 4)); //24
这样,就可以成功导入 tool-multiply.js
文件了。
方法三
如果全部单个文件丢在 node_modules
上,它会显得杂乱无章,所以我们应该定义个自己的模块:xiaojia-module
,然后将我们的 tools.js
存放在该目录中:
xiaojia-module/tools.js
var tools = {
add: (...numbers) => {
let sum = 0;
for (let number in numbers) {
sum += numbers[number];
}
return sum;
},
multiply: (...numbers) => {
let sum = numbers[0];
for (let number in numbers) {
sum = sum * numbers[number];
}
return sum;
}
}
module.exports = tools;
这样,我们就定义好了自己的工具库。
但是,如果我们通过 var tools3 = require('xiao-module');
去导入,会发现它报 error
了,所以,我们应该在 xiao-module
目录下,通过下面命令行生成一个package.json
PS E:\blog\node_modules\xiaojia-module> npm init --yes
这样,在 jsliang-module
中就有了 package.json
。而我们在 CommonJS.js
就可以引用它了:
var http = require("http");
var tools1 = require('./tool-add');
// 如果 Node 在当前目录没找到 tool.js 文件,则会去 node_modules 里面去查找
var tools2 = require('tool-multiply');
/**
* 通过 package.json 来引用文件
* 1. 通过在 xiaojia-module 中 npm init --yes 来生成 package.json 文件
* 2. package.json 文件中告诉了程序入口文件为 :"main": "tools.js",
* 3. Node 通过 require 查找 xiaojia-module,发现它有个 package.json
* 4. Node 执行 tools.js 文件
*/
var tools3 = require('xiaojia-module');
http.createServer(function (req, res) {
res.writeHead(200, {"Content-Type": "text/html;charset=UTF-8"});
res.write('<h1>Hello NodeJS</h1>');
console.log(tools1.add(1, 2, 3));
console.log(tools2.multiply(1, 2, 3, 4));
console.log(tools3.add(4, 5, 6));
/**
* Console:
* 6
* 24
* 15
*/
res.end();
}).listen(8000);
到此,我们就通过三种方法,了解了各种 exports
和 require
的知识以及 Node 模块化的概念啦~
- 参考文献:
CommonJS 规范 | 博客园 - Little Bird
[js高手之路] es6系列教程 - 不定参数与展开运算符(...)
三、debugger
创建一个debugger的文件夹
app.js
app.js代码入口,先不要在意具体代码是什么,后边会继续讲解,我们主要是学习一下debugger的使用
const http =require('http')
const server =http.createServer((req,res)=>{
res.writeHead(200,{'content-type':'text/html'})
res.end('<h1>hello world</h1>')
})
server.listen(3000,()=>{
console.log('listening on 3000 port ')
})
点击debugger调试工具,点击调试 控制台会输出如下内容,此时我们就可以打开浏览器http://localhost:3000/看到界面显示hello word
四、包与npm
Node 中除了它自己提供的核心模块之外,还可以自定义模块,以及使用 第三方模块。
Node 中第三方模块由包组成,可以通过包来对一组具有相互依赖关系的模块进行统一管理。
- 假如我们需要使用一些第三方模块,应该去哪找呢?
- npm 是什么?
npm 是世界上最大的开放源代码的生态系统。我们可以通过 npm 下载各种各样的包。在我们安装 Node 的时候,它默认会顺带给你安装 npm。
npm -v: 查看 npm 版本。
npm list: 查看当前目录下都安装了哪些 npm 包。
npm info 模块:查看该模块的版本及内容。
npm i 模块@版本号:安装该模块的指定版本。
- 在平时使用 npm 安装包的过程中,你可能需要知道一些 npm 基本知识:
i
/install
:安装。使用install
或者它的简写i
,都表明你想要下载这个包。uninstall
:卸载。如果你发现这个模块你已经不使用了,那么可以通过uninstall
卸载它。g
:全局安装。表明这个包将安装到你的计算机中,你可以在计算机任何一个位置使用它。--save
/-S
:通过该种方式安装的包的名称及版本号会出现在package.json
中的dependencies
中。dependencies
是需要发布在生成环境的。例如:ElementUI
是部署后还需要的,所以通过-S
形式来安装。--save-dev
/-D
:通过该种方式安装的包的名称及版本号会出现在package.json
中的devDependencies
中。devDependencies
只在开发环境使用。例如:gulp
只是用来压缩代码、打包的工具,程序运行时并不需要,所以通过-D
形式来安装。
- 这么多的 npm 包,我们通过什么管理呢?
答案是 package.json
。
如果我们需要创建 package.json
,那么我们只需要在指定的包管理目录(例如node_modules
)中通过以下命名进行生成:
npm init 按步骤创建 package.json
npm init --yes 快速创建 package.json
当然,因为国内网络环境的原因,有些时候通过 npm 下载包,可能会很慢或者直接卡断,这时候就要安装淘宝的 npm 镜像:cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
五、server端开发和前端开发的区别
- 服务稳定性
- server可能会各种恶意攻击和误操作
- 单个客户端可以意外挂掉,但服务端不能
- 使用PM2做进程守候
- 考虑内存和CPU(优化和拓展)
- 客户端独占一个浏览器,内存和CPU都不是问题
- server端要承载很多请求,CPU和内存都是稀缺资源
- 使用stream写日志(优化) redis存session
- 日志记录
- 前端也会参与写日志,但只是日志的发起方,不关心后续
- server端要记录日志,存储日志,分析日志,前端不关心
- 安全
server端要随时准备接收各种恶意攻击,前端则很少,如越权操作,数据库攻击等
- 集群和服务拆分
- 产品发展速度快,流量可能会迅速增加
- 如何通过扩展机器和服务拆分来承载大流量
六、需求分析
6.1 项目功能
- 首页、作者主页、博客详情页
- 登录页
- 管理中心、新建页、编辑页
6.2技术方案
- 数据如何存储
- 如何与前端对接,即接口设计
6.3具体内容
- 数据存储
存储博客
存储用户
- 接口设计