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端口 
        有必要通过反向代理来实现基于域名的端口共享(不懂什么意思)
    需要手动启动  
        实现一个动态启动/关闭服务器的脚本

posted on 2017-12-27 16:04  刘先坤  阅读(190)  评论(0编辑  收藏  举报

导航