目录
一、Nodejs和JavaScript的区别
二、commonjs
三、debugger
四、包与npm
五、server端开发和前端开发的区别
六、需求分析
只定义语法标准
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模块化编程之彻底弄懂CommonJS和AMD/CMD!
[js高手之路] es6系列教程 - 不定参数与展开运算符(...)
创建一个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
Node 中除了它自己提供的核心模块之外,还可以自定义模块,以及使用 第三方模块。
Node 中第三方模块由包组成,可以通过包来对一组具有相互依赖关系的模块进行统一管理。
假如我们需要使用一些第三方模块,应该去哪找呢? 百度。百度查找你需要安装的第三方模块的对应内容。npm 官网。如果你已经知道包的名字或者包的作用。那么,直接在 npm 官网上搜索,想必会更快找到想要安装的包。 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.orgserver端要随时准备接收各种恶意攻击,前端则很少,如越权操作,数据库攻击等
集群和服务拆分 产品发展速度快,流量可能会迅速增加如何通过扩展机器和服务拆分来承载大流量存储博客
存储用户
接口设计