Node.js 第三天笔记
知识点
- 模块系统
- 核心模块
- 第三方模块
- 自己写的模块
- 加载规则以及加载机制
- 循环加载
- npm
- package.json
- Express
- 第三方web开发框架
- 高度封装了http模块
- 更加专注于业务,而非底层细节
- 知其所以然
- 增删改查
- 使用文件来保存数据(锻炼异步编码)
- MongoDB
- (所有方法都封装好了)
反馈
- 书籍:
- 《JavaScript 高级编程》第三版
- 《JavaScript 语言精粹》
复习
- 网站开发模型
- 黑盒子
- 写代码让它变得更智能
- 按照设计好的讨论供用户使用
- 在Node中使用 art-template 模板引擎
- 安装
- 加载
- templae.render()
- 客户端渲染和服务器渲染的区别
- 最少两次请求,发起ajax在客户端使用模板引擎渲染
- 客户端拿到的就是服务端已经渲染好的
- 处理留言本案例首页数据列表渲染展示
- 处理留言本案例发表留言功能
- 路径
- 设计好的请求路径
- 掌握如何解析请求路径中的查询字符串
- url.parse()
- 如何在 Node 中实现服务器重定向
- header(‘Location’,’/’)
- 301 永久重定向,浏览器会记住
- 302 临时重定向,浏览器不记忆
- Node 中的 console (REPL) 使用
PHP和Node比较
- PHP+Apache(默认帮你封装好了很多底层细节操作)
- 在Node中,比较偏底层,很多东西需要亲自写代码来实现。
- 在Node中,我们开启的Web服务是一个完整的黑盒子,它不像php。
- php中无论是代码还是网页,都可以直接通过web url路径来访问。
- 在Node中开启的服务器,默认是和盒子,所有资源都不允许用户来访问,用户可以访问哪些资源由具体的开发人员编写设计的代码为准。
Node中的模块系统
- 使用Node编写应用程序主要就是在使用:
- EcmaScript语言
- 和浏览器不一样,在Node中没有 BOM、DOM
- 核心模块
- 文件操作的fs
- http服务的http
- url路径操作模块
- path路径处理模块
- os操作系统信息
- 第三方模块
- art-template
- 必须通过npm下载才可以 使用
- 咱们自己写的模块
- 自己创建的文件
什么是模块化
- 文件作用域
- 通信规则
- 加载 require
- 导出 export
CommonJS模块化规范
在Node中的JavaScript还有一个很重要的概念:模块系统。
- 模块作用域
- 使用require方法用来加载模块
- 使用exports接口对象用来导出模块成员
加载 require
语法:
var 自定义变量 = require(‘模块’)
两个作用:
- 执行被加载模块中的代码
- 得到被加载模块中的exports导出接口对
导出exports
- Node中是 模块 haul作用域,默认文件中所有成员只在当前文件模块中有效
- 对于希望可以被其他模块访问的成员,我们就需要把这些公开的成员都挂载到exports接口对象中就可以了
导出多个成员(必须在对象中):
exports.a = 123
exports.b = 'hello'
exports.c = function(){
console.log('ccc);
}
exports.d = {
foo: 'bar'
}
导出单个成员(字符串、函数):
module.exports = 'hello'
以下情况会覆盖:
module.exports = 'hello'
module.exports = function(x,y){
return x+y
}
也可以这样导出多个成员:
module.exports = {
add: function(){
return x+y
},
str: 'hello'
}
原理解析
export 是 module.exports的一个引用:
// var module = {
// export = {}
// }
// var exports = module.exports
console.log(exports === module.exports) // => true
exports.foo = 'bar'
// 等价于
module.exports.foo = 'bar'
// return module.exports
exports 和 module.exports 的区别
- 每个模块中都有一个module 对象
- module对象中有一个exports对象
- 我们可以把需要导出的成员都挂载到module.exports接口对象中
- 也就是:module.exports.xxx=xxx的方式
- 但是每次都module.exports.xxx=xxx很麻烦,调用太多了
- 所以node为了方便,同时在每一个模块中都提供了一个成员叫:exports
- exportx === module.exports结果为true
- 所以对于:module.exports.xxx=xxx的方式完全可以:exports.xxx=xxx
- 当一个模块需要导出单个成员时候,这个时候必须使用:module.exports=xxx的方式
- 不要使用exports = xxx,导出单个成员这种方式不管用
- 因为每个模块最终向外return的是module.exports
- 而exports只是module.exports的一个引用
- 所以即便你为exports = xx重新赋值,也不会影响module.exports
- 但是有一种赋值方式比较特殊:exports = module.exports这个用来重新建立引用关系
- 之所以让大家明白这个道理,是希望可以更灵活的去用它
- Node是一个比肩Java,php的一个平台
- JavaScript既能写前端也能写服务端
require方法加载规则
深入先出Node.js(三),深入Node.js的模块机制
如果想要了解更多底层细节,可以自行参考:《深入浅出Node.js》中的额模块系统章节
www.infoq.com/cn
- 核心模块
- 模块名
- 第三方模块
- 模块名
用户自己写的
- 路径
优先从缓存加载
判断模块标识
核心模块:
- 核心模块的本质也是文件
- 核心模块文件已经被编译到了二进制文件中了,我们只需要按照名字来加载就可以了
- require(‘fs’)
- 第三方模块:
- 凡是第三方模块都必须通过npm来下载
- 使用的时候就可以通过require(‘报名’)的方式来进行加载才可以使用
- 不可能有任何一个第三方包和核心模块的名字是一样的
- 既不是核心模块,也不是路径形式的模块
- 先找到当前文件所处目录中的 node_modules目录
- var template = require(‘art-template’)
npm
node package manager
- npm网站
- npmjs.com
- npm命令行工具
- npm的第二层含义就是一个命令行工具,只要你安装了node就已经安装了npm
- 常用命令:
- npm –version 查看版本
- npm install –global npm 版本升级
- npm init
- npm init -y可以跳过向导,快速生成
- npm install
- 一次性把dependencies选项中的依赖项全部安装
- npm intall 包名
- 只下载
- npm install –save 包名
- 下载并保存依赖项(package.json文件中的dependencies选项)
- npm i -S 包名
- npm uninstall 包名
- 只删除,如果有依赖性依然会保存
- npm un 包名
- npm uninstall 包名 –save
- 删除的同时也会把以来信息也去除
- npm un -S 包名
- npm help
- 查看使用帮助
- npm 命令 –help
- 查看指定命令的使用帮助
- 例如:npm uninstall –help来查看使用帮助
- 解决npm 被墙问题
npm存储包文件的服务器在国外,有时候会被墙,速度很慢,所以我们需要解决这个问题。
http://npm.taobao.org
安装淘宝的cnpm:
npm install –global cnpm
接下来安装包的时候把之前的npm替换成cnpm即可
例如:
cnpm install jquery #通过淘宝的服务器来下载jquery
如果不想安装cnpm又想使用淘宝的服务器来下载:
npm install jquery –registry https://registry.npm.taobao.org
但是每次手动加参数很麻烦,我们可以把这个选项加入配置文件中:
npm config set registry https://registry.npm.taobao.org
查看 npm 配置信息: npm config list
只要经过上面命令的配置,以后所有的npm install都会默认通过淘宝的服务器来下载。
package.json
我们建议每个项目都要有一个package.json文件(包括描述文件、就像产品说明书一样)。用来记录安装的包日志
这个文件时通过 npm init命令的方式自动初始化出来的
如果node_modules删除了也不用担心,只需要:npm install就会自动把package.json中的dependencies中所有的依赖项都下载下来。
建议执行npm install包名的时候都加上–save这个选项,目的是用来保存项目依赖信息
Express
原生的http在某些方面表现不足以应对我们的开发需求,所以我们就需要使用框架加快我们开发效率,框架的目的就是提高效率,让我们的代码更高度统一。
在Node中,有很多web开发框架,以express为主。
案例:
// 0 安装
// 1 引包
var express = require('express');
// 2 创建服务器应用程序,也就是原来的http.createServer
var app = express();
// 公开指定目录:
// 只要这么做,就可以直接通过/public/xx的方式访问public目录中的所有资源了。
app.use('/public/',express.static('./express'));
// 当服务器收到get请求 / 的时候,执行回调处理函数
app.get('/',function(req,res){
res.send('hello express!')
});
app.get('/about',function(req,res){
res.send('你好,我是express!')
});
// 相当于 server.listen
app.listen(3000,function(){
console.log('app is running at port 3000');
});