node.js进阶话题
< h3>notes_控制流
//forloopi.js
var fs = require('fs');
var files = ['a.txt', 'b.txt', 'c.txt'];
for (var i = 0; i < files.length; i++) {
fs.readFile(files[i], 'utf-8', function(err, contents) {
console.log(files);
console.log(i);
console.log(files[i]);
});
}
[ 'a.txt', 'b.txt', 'c.txt' ]
3
undefined
[ 'a.txt', 'b.txt', 'c.txt' ]
3
undefined
[ 'a.txt', 'b.txt', 'c.txt' ]
3
undefined
以上content可以正常取值 问题:闭包导致的问题 callback作用域链中保存着上一层级的i的引用 值为3 readFile(files[i])此时的i为0 1 2 callback内部的i 为3 解决
闭包
forEach
files.forEach(function(filename){
fs.readFile(filename, "utf-8", function(err, contents){
console.log(filename + ":" + contents);
})
}) 解决控制流难题
async模块
streamlinejs模块
jscex模块
< h3>notes_模块的加载机制
6.1 模块的加载机制
Node.js模块分为两大类
核心模块
Node.js标准API中提供的模块(fs http net vm)这些都是由Node.js官方提供的模块,编译成了二进制
可以通过require获取核心模块 例require("fs") 核心模块拥有最高的加载优先级 如果命名冲突 总会加载核心模块
文件模块
存储为单独的文件(或文件夹)的模块 可以是js json 或编译好的C++代码 文件模块的加载方法相对复杂 但十分灵活 尤其是和npm结合使用 在不指定文件模块扩展名的时候 Node.js会分别试图加上.js .json .node扩展名 优先级依次排列
文件模块的加载有两种方式
路径加载
如果require参数以"/"开头,那么就以绝对路径的方式查找模块名称 例如require("/home/byvoid/module")将会按照优先级依次尝试加载/home/byvoid/module.js 或 /home/byvoid/module.json 或 /home/byvoid/module.node
如果require参数以 "./" "../"开头 那么则以相对路径的方式来查找模块 例子require("./hello") 加载同文件夹下面的hello.js
查找node_modules文件夹 通过node_modules目录加载模块
若果require参数不以 "/" "./" "../"开头 而该模块又不是核心模块 那么就通过node_modules加载模块 我们使用的npm获取的包通常就是这种方式加载的
在某个目录文件下执行 npm install express 你会发现一个叫做 node_modules的目录 在node_modules目录的外面一层 我们可以用require("express")来代替require("./node_modules/express") 这是Node.js模块加载的一个重要特征
***我们如果在/home/byvoid/dev.foo.js 中使用require("bar.js") 查询如下
/home/byvoid/dev/node_modules/foo.js
/home/byvoid/node_modules/foo.js
/home/node_modules/foo.js
/node_modules/foo.js
因为通常一个工程内会有一些子目录 当子目录中文件需要访问到工程文件依赖的模块是 就需要像父目录上溯了
例如在project文件夹中使用express 就需要到根目录的node_modules/express 中使用express
加载缓存
node是以解析到的文件作缓存的 跟require的方式无关
例如 require("express") 和 require("./node_modules/express")加载两次 不会重复加载 因为解析到的文件是同一个
加载顺序 require(some_module)
1 如果some_module是一个核心模块 直接加载 结束
2 如果some_module是以"./" "../" "/" 开头 按路径加载some_module结束
3 假定当前目录为current_dir 按路径加载current_dir/some_module/some_module 如成功 结束
加载失败 令current_dir为其父目录 重复这一过程 直到加载到根目录 抛出异常 结束
notes_Node.js应用部署
目前写的微博项目有几个重大缺陷
不支持故障恢复
遇到bug直接宕机 在产品环境需要有故障恢复 提高系统的可靠性
没有日志
需要有 访问日志 错误日志
无法利用多核提高性能
Node.js是单线程的 一个进程只能利用一个CPU核心 当请求大量到来 单线程就成了提高吞吐量的瓶颈 需要
使用多进程来提高系统的性能
独占端口
很多时候我们会在一个服务器上搭建多个网站 不能每一个进程都独享80端口
有必要通过反向代理来实现基于域名的端口共享(不懂什么意思)
需要手动启动
实现一个动态启动/关闭服务器的脚本
node.js进阶话题的更多相关文章
- Node.js进阶篇-koa、钩子函数、websocket、嵌入式开发
代码地址如下:http://www.demodashi.com/demo/12932.html 一.简介 koa是由Express原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的We ...
- Node.js进阶:5分钟入门非对称加密方法
前言 刚回答了SegmentFault上一个兄弟提的问题<非对称解密出错>.这个属于Node.js在安全上的应用,遇到同样问题的人应该不少,基于回答的问题,这里简单总结下. 非对称加密的理 ...
- egg.js-基于koa2的node.js进阶(一)
一.路由进阶Egg路由的路由重定向,路由分组 在router.js修改为如下格式require引用 module.exports = app => { const { router, contr ...
- 一个不错的Node.js进阶学习引导
https://cnodejs.org/topic/58ad76db7872ea0864fedfcc
- 《Node.js开发指南》知识整理
Node.js简介 Node是一个可以让JavaScript运行在服务器端的平台,抛弃了传统平台依靠多线程来实现高并发的设计思路,而采用单线程.异步式I/O.事件驱动式的程序设计模型. 安装和配置No ...
- 初学node.js有感二
node.js进阶 一.回顾与继续 对于一种语言的认识都是经历这样的一个过程的,首先从原生的环境(CMD)中开始学习,找到一门语言之间各种引用的本质和相互之间的调用方式,明澈各种依赖关系,在这个基 ...
- Node.js 开发指南
1.Node.js 简介 Node.js 其实就是借助谷歌的 V8 引擎,将桌面端的 js 带到了服务器端,它的出现我将其归结为两点: V8 引擎的出色: js 异步 io 与事件驱动给服务器带来极高 ...
- javaScript 和 node.js 的一些文章收集
这里收集了一些文章的链接,方便自己查询翻看,也避免把别人的成果复制过来再发布,节约时间. ThinkJS 3 正式版发布 我来回答饿了么大前端的问题(1) 一起理解 Virtual DOM 探讨Nod ...
- Node.js学习看这里:基础、进阶、文章
Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装,它主要用于创建快速的.可扩展的网络应用. Node.js采用事件 ...
随机推荐
- 【读书笔记与思考】《python数据分析与挖掘实战》-张良均
[读书笔记与思考]<python数据分析与挖掘实战>-张良均 最近看一些机器学习相关书籍,主要是为了拓宽视野.在阅读这本书前最吸引我的地方是实战篇,我通读全书后给我印象最深的还是实战篇.基 ...
- JDBC详解系列(三)之建立连接(DriverManager.getConnection)
在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加载Driver类,注册数据库驱动: 第二步:通过DriverManager,使用url,用户名和密码 ...
- Git Workflow简介
1. Git WorkFlow介绍 Git Flow是构建在Git之上的一个组织软件开发活动的模型,是在Git之上构建的一项软件开发最佳实践.Git Flow是一套使用Git进行源代码管理时的一套行为 ...
- sqlserver资源
1.数据库“高可用性”和“灾难恢复”技术 参考: niyi0318的专栏
- Oracle误删数据文件后出现oracle initialization or shutdown in progress解决
一.错误分析 1.首先本人在出现这种情况的背景是执行如下SQL语句后生成的表空间 --自定义表空间 数据表空间 临时表空间 CREATE TEMPORARY TABLESPACE HOUSE_TEMP ...
- 【数论】洛谷P1372又是毕业季
题目背景 "叮铃铃铃",随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业 ...
- 生成器&迭代器
通过列表生成式,我们可以快速创建一个列表,但是受到内存的限制,列表容量是有限的,而且一个包含100万个元素的列表不仅占用很大的存储空间,如果我们仅仅需要访问当前几个元素,那后面绝大多数元素占用的空间都 ...
- 深度解剖dubbo源码
-----------学习dubbo源码,能给你带来什么好处?----------- 1.提升SOA的微服务架构设计能力 通过读dubbo源码是一条非常不错的通往SOA架构设计之路,毕竟SOA的服 ...
- C#学习笔记-基础知识篇(不定期更新)
1.父类必须包含构造函数么? 父类必须要有一个构造函数,有参无参都可以. 构造函数是对象的基本,没有构造函数就没有对象,若父类中显示的有参数的构造函数,在子类继承就必须写一个构造函数来调用父类的构造函 ...
- 谈谈关键字new
1.在情人节那天,无意间看到空间有人说,没有对象就new一个,然后就可以........ 程序中我们常用到X a=new X(), new在这里是创建一个对象,也可以叫做创建一个实例,我们先谈谈后半部 ...