Nodejs开发博客01_项目准备

本项目重点内容

  1. Node基础 — 通过对Node基础的了解学习,打下Node基础
  2. NodeAPI — 开启服务提供API给前端调用
  3. Node连接MySQ L— 通过node操作数据库,实现增删改查的功能
  4. Node实战 — 个人博客从零开始,打造首页、作者主页、博客详情页、登录页、新建页、编辑页
  5. Node框架express重构博客项目

 

目录

一、Nodejs和JavaScript的区别

二、commonjs

三、debugger

四、包与npm

五、server端开发和前端开发的区别

六、需求分析

 

一、Nodejs和JavaScript的区别

 

只定义语法标准

二、commonjs

  • 什么是commonjs

CommonJS 就是为 JS 的表现来制定规范,因为 JS 没有模块系统、标准库较少、缺乏包管理工具,所以 CommonJS 应运而生,它希望 JS 可以在任何地方运行,而不只是在浏览器中,从而达到 Java、C#、PHP 这些后端语言具备开发大型应用的能力。

  • commonjs的应用
  1. 服务器端JavaScript应用程序
  2. 命令行工具
  3. 图形界面应用程序
  4. 混合应用程序(如,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模块化编程之彻底弄懂CommonJS和AMD/CMD! 

[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 中第三方模块由包组成,可以通过包来对一组具有相互依赖关系的模块进行统一管理。

  • 假如我们需要使用一些第三方模块,应该去哪找呢?
  1. 百度。百度查找你需要安装的第三方模块的对应内容。
  2. npm 官网。如果你已经知道包的名字或者包的作用。那么,直接在 npm 官网上搜索,想必会更快找到想要安装的包。
  • npm 是什么?

npm 是世界上最大的开放源代码的生态系统。我们可以通过 npm 下载各种各样的包。在我们安装 Node 的时候,它默认会顺带给你安装 npm。

npm -v:    查看 npm 版本。
npm list:  查看当前目录下都安装了哪些 npm 包。
npm info    模块:查看该模块的版本及内容。
npm i       模块@版本号:安装该模块的指定版本。
  • 在平时使用 npm 安装包的过程中,你可能需要知道一些 npm 基本知识:
  1. i/install:安装。使用 install 或者它的简写 i,都表明你想要下载这个包。
  2. uninstall:卸载。如果你发现这个模块你已经不使用了,那么可以通过uninstall 卸载它。
  3. g:全局安装。表明这个包将安装到你的计算机中,你可以在计算机任何一个位置使用它。
  4. --save/-S:通过该种方式安装的包的名称及版本号会出现在 package.json 中的 dependencies 中。dependencies 是需要发布在生成环境的。例如:ElementUI 是部署后还需要的,所以通过 -S 形式来安装。
  5. --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端开发和前端开发的区别

  • 服务稳定性
  1. server可能会各种恶意攻击和误操作
  2. 单个客户端可以意外挂掉,但服务端不能
  3. 使用PM2做进程守候
  • 考虑内存和CPU(优化和拓展)
  1. 客户端独占一个浏览器,内存和CPU都不是问题
  2. server端要承载很多请求,CPU和内存都是稀缺资源
  3. 使用stream写日志(优化) redis存session
  •  日志记录
  1. 前端也会参与写日志,但只是日志的发起方,不关心后续
  2. server端要记录日志,存储日志,分析日志,前端不关心
  • 安全

server端要随时准备接收各种恶意攻击,前端则很少,如越权操作,数据库攻击等

  • 集群和服务拆分
  1. 产品发展速度快,流量可能会迅速增加
  2. 如何通过扩展机器和服务拆分来承载大流量

六、需求分析

6.1 项目功能

  • 首页、作者主页、博客详情页
  • 登录页
  • 管理中心、新建页、编辑页

6.2技术方案

  1. 数据如何存储
  2. 如何与前端对接,即接口设计

6.3具体内容

  • 数据存储

存储博客

存储用户

  • 接口设计 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值