nodejs快速入门(三)-模块引入与加载机制

        本篇文章介绍nodejs的模块引入与加载机制。

(一)模块引入与常用内置对象

    1、module

        nodejs认为一个js文件就是一个模块,每个模块都有一个全局对象module,同时module对象中有一个对象exports。

 这个对象被加载一次之后会别缓存,里面提供了模块的父子模块关联信息,即父模块被那些模块引用,子模块引用了那些模块。

    Module {
              id: '.',
              exports: {},
              parent: null,
              filename: 'E:\\workspace\\myRequre.js',
              loaded: false,
              children: [],

              paths: [ 'E:\\workspace\\ node_modules', 'E:\\workspace\\node_modules', 'E:\\node_modules' ] 

        }

2、exports

    exports是module.exports对象的别名,提供便捷的属性和方法设置。如

    exports.add = function(v1,v2){ return v1 + v2;} 模块中的module.exports对象就增加了add方法。

3、require

    require可以加载文件模块(.js、.code、.json)和nodejs核心模块,最终获取到的是module.exports对象。第一次加载的时候执行代码,第二次从缓存中获取module.exports对象,如果没有发现指定模块就报错not find module。

下面模拟require对象:

myRequire.js

function MyRequre(path){

	function Module(){
		this.exports = {};
	}

	var fs = require('fs');

	var source = fs.readFileSync(path,'utf8');

	var package = "(function(exports,module){"+source+" return module.exports;})";

	var callback = eval(package);

	var module = new Module();
	var fn  = callback(module.exports, module);

	return fn;
}

fnModule.js

module.exports=function(){
	return 123;
};

调用

var fn = MyRequre('./foo.js');
console.log(fn());

结果:123

4、nodejs的核心模块


核心模块的源码都在lib子目录中,为了提高运行速度,他们按照的时候,都会被编译成二进制文件。

模块加载机制

        ①

5、package

   包是将一堆的文件联系起来的一种机制,nodejs就是在模块的基础之上进一步组织javascript代码。

    

  规范的包目录结构  

文件/目录 说明
package.json     包描述文件,不仅开发者阅读使用,nodejs也使用
bin 存放可执行的文件目录
lib 存放JavaScript的目录
doc 存放文档目录
test 单元测试用例代码

package.json文件,如

{
  "name": "test",
  "version": "0.0.1",
  "description": "",
  "main": "index.js",
  "keywords": [
  ],
  "author": "KingNigel",
  "repository": {
    "type": "git",
    "url": "https://github.com/KingNigel/test.git"
  },
  "bugs": {
    "url": "https://github.com/KingNigel/test/issues"
  },
  "license": "MIT",
  "devDependencies": {
    "express": "4.*"
  },
  "dependencies": {
    "express": "4.*"
  }
}
属性 描述
name 包名
description 包简介
version 包版本号
keywords 关键词组,在npm中分类搜索使用
author 包作者
main 配置包入口,默认是根目录下index.js
dependencies 包依赖项,npm会自动加载依赖包
scripts 指定运行脚本命令npmn命令行

5、mpn

    全球最大的第三方模块生态系统(http://www.npmjs.com),package是一个规范,npm是实现,作用是暗装和管理node模块。

基础使用命令

        npm install 包名 —— 当执行该命令时,回到npm网站找到github地址,下载压缩包,并加压。然后,在npm当前目录下查找node_modules目录,将解压文件放到该目录下,如果没有找打该目录就创建。

        npm install -g 包名 —— 表示全局全装,npm会设置一个按照目录,将包放到该目录中,并提供命令行工具。

        npm i -S  包名@版本号 —— 添加依赖项到package.json文件的denpendencies字段中, 生产环境使用。

        npm i -D 包含@版本号 —— 添加依赖项到package.json文件的devDenpendencies字段中,开发环境使用。

        npm config set prefix —— 修改全局按照目录,不建议使用,建议到npm目录下的.npmrc文件中修改 prefix = 安装目录,在windows的全局环境path中把按照目录配置进去。


6、文件操作

    ①箭头函数  ECMAScript6.0 支持的一种函数语法

        函数有一个参数,有返回值写法: var fn = v => v ;第一个v表示参数 ,第二个v表示返回值。

        函数没有参数,有返回值 var fn = () => v 

        函数有多个参数,有返回值 var fn = (v1,v2) => {return v1 + v2}

        函数有多个参数,没有返回值 var fn = (v1,v2) => {console.log(v1); console.log(v2)}

        

    ②fs文件读写

           fs是nodejs的一个核心模块,用于读文件操作。内部的方法一般都是成对出现的,分为同步和异步。

    (1)fs.readFile(filepath, [options], callback)

            filepath 文件路径

            options可选参数,object {"encoding":"uft8","flag":"r"} ,一般使用“utf8”

            callback = function(err,data){} 参数err:表示读文件错误时的返回的错误信息,默认值为null;data表示读文件成功返回的数据,默认值为undefined。

           var data = fs.readFileSync(filepath,[options])     此方法为异步方法, 直接返回数据。

    (2)fs.access(path,[mode], callback) 判断文件是否存在

            model一般不用写; callback= function(err){} 只有一个err参数。

模拟fs读文件操作

        在node_modules目录中创建一个readf文件夹,该文件夹目录中创建一个package.json

{
  "name": "readf",
  "version": "0.0.1",
  "description": "",
  "main": "readf.js",
  "keywords": [
  ],
  "author": "KingNigel",
  "repository": {
    "type": "git",
    "url": "https://github.com/KingNigel/test.git"
  },
  "bugs": {
    "url": "https://github.com/KingNigel/test/issues"
  },
  "license": "MIT",
  "devDependencies": {
    "express": "4.*"
  },
  "dependencies": {
    "express": "4.*"
  }
}

    再创建一个read.js文件

var fs=require('fs');

var rf=function(path,callback){

fs.access(path, (err) => {
   if(err){
      callback(err);
   }
    fs.readFile(path,'utf8',(err,data)=>{
        callback(null,data)
    })
});
}
module.exports=rf;

在node_modules的同级目录下创建一个test.js

var fr = require("readf");

fr("./package.json",function(err,data){
	console.log(data);
});
结果就是package.json中的内容。

猜你喜欢

转载自blog.csdn.net/u013174239/article/details/79705542