node 知识点

  • 问:局部安装如何使用npm run命令?
    答:如果已局部安装了babel-cli(babel-cli自带babel-node命令),package.json文件配置如下:
"scripts": {  
"build": "./node_modules/.bin/babel-node index.js" 
} 
  • 问:mac 下 node 如何升级?
    答:下载新版的 pkg 安装文件,双击直接安装即可。或使用node版本管理模块n:http://www.cnblogs.com/cag2050/p/7568637.html

  • 第一次加载某个模块时,Node会缓存该模块。以后再加载该模块,就直接从缓存取出该模块的module.exports属性。
    如果想要多次执行某个模块,可以让该模块输出一个函数,然后每次require这个模块的时候,重新执行一下输出的函数。
    所有缓存的模块保存在require.cache之中,如果想删除模块的缓存,可以像下面这样写。

// 删除指定模块的缓存
delete require.cache[moduleName];
// 删除所有模块的缓存
Object.keys(require.cache).forEach(function(key) {
    delete require.cache[key];
})

注意,缓存是根据绝对路径识别模块的,如果同样的模块名,但是保存在不同的路径,require命令还是会重新加载该模块。

  • 目录的加载规则:
    通常,我们会把相关的文件会放在一个目录里面,便于组织。这时,最好为该目录设置一个入口文件,让require方法可以通过这个入口文件,加载整个目录。
    在目录中放置一个package.json文件,并且将入口文件写入main字段。下面是一个例子。
// package.json
{
    "name" : "some-library",
    "main" : "./lib/some-library.js" 
}

require发现参数字符串指向一个目录以后,会自动查看该目录的package.json文件,然后加载main字段指定的入口文件。如果package.json文件没有main字段,或者根本就没有package.json文件,则会加载该目录下的index.js文件或index.node文件。

  • CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。
    AMD规范则是非同步加载模块,允许指定回调函数。
    由于Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用AMD规范。

  • require命令用于加载文件,后缀名默认为.js。
    根据参数的不同格式,require命令去不同路径寻找模块文件。
    (1)如果参数字符串以“/”开头,则表示加载的是一个位于绝对路径的模块文件。比如,require('/home/marco/foo.js')将加载/home/marco/foo.js。
    (2)如果参数字符串以“./”开头,则表示加载的是一个位于相对路径(跟当前执行脚本的位置相比)的模块文件。比如,require('./circle')将加载当前脚本同一目录的circle.js。
    (3)如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。
    举例来说,脚本/home/user/projects/foo.js执行了require('bar.js')命令,Node会依次搜索以下文件。

/usr/local/lib/node/bar.js
/home/user/projects/node_modules/bar.js
/home/user/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js

这样设计的目的是,使得不同的模块可以将所依赖的模块本地化。
(4)如果参数字符串不以“./“或”/“开头,而且是一个路径,比如require('example-module/path/to/file'),则将先找到example-module的位置,然后再以它为参数,找到后续路径。
(5)如果指定的模块文件没有发现,Node会尝试为文件名添加.js、.json、.node后,再去搜索。.js件会以文本格式的JavaScript脚本文件解析,.json文件会以JSON格式的文本文件解析,.node文件会以编译后的二进制文件解析。
(6)如果想得到require命令加载的确切文件名,使用require.resolve()方法。

  • 在Node.js中,可以使用 require.resolve 函数来查询某个模块文件的带有完整绝对路径的文件名,代码如下所示。
    require.resolve('./testModule.js');
    在这行代码中,我们使用 require.resolve 函数来查询当前目录下 testModule.js 模块文件的带有完整绝对路径的模块文件名。
    注意:使用 require.resolve 函数查询模块文件名时并不会加载该模块。

  • 入口文件app.js里的路由,按顺序执行;

  • 根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性。

  • global:全局命名空间,通过 global 定义的变量,在任何地方都可以使用,类似于浏览器端定义在全局范围中的变量。
    定义在 global 上面的变量,不需要在模块中通过 exports 输出,其他模块中也能使用。

  • node中定义全局变量,不应该使用global,而应该使用模块。
    举例:
    文件 main.js:

exports.company = 'Google';  
var m = require('./mod'); 

文件 mod.js:

var company = require('./main').company;  
console.log(company); 

执行结果:

$ node main.js  
Google 

posted on 2017-09-21 10:41  cag2050  阅读(157)  评论(0编辑  收藏  举报

导航