Node.js学习笔记(三)

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为主。

官网: http://expressjs.com/

案例:

// 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');
});

猜你喜欢

转载自blog.csdn.net/yw00yw/article/details/81663189
今日推荐