模块代码Node.js[4] 第一个模块 -java教程

查了好多资料,发现还是不全,干脆自己理整吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!

    

    面前几篇算是node各种基本,这篇向着创立第一个node模块的标目迈进。之前的文章复反说起模块在node中的主要性。正因为有了模块,node才有了扩展性,才会有如此多的node社区员成介入进来,node才能如此迅速地开展。

    

    NPM(Node Packaged Module,以后简称module或模块)是node的内置功能,通过module的式形为node带来更多的API。其实node原生API也是通过模块的式形供给给发开者应用的。

    

    

模块?

    node实现了commonjs module范规。下面的例子来自Module范规,修改了require输入参数以便能在node中运行,请参照注释别分存保至3个件文中,或者载下整完示例代码

    // 这段代码存保为件文math.js

    exports.add =

    function

    () {

    var

    sum = 0, i = 0, args =

    arguments

    , l = args.

    length

    ;

    while

    (i < l) {

    sum += args[i++];

    }

    return

    sum;

    };

    // 这段代码存保为件文increment.js

    var

    add = require('./math').add;

    exports.increment =

    function

    (val) {

    return

    add(val, 1);

    };

    // 这段代码存保为件文program.js

    var

    inc = require('./increment').increment;

    var

    a = 1;

    inc(a);

    // 2

    console.log('a=', inc(a));

    

模块分类

    node中模块可分为核心模块(Core Module)和第三方模块,核心模块是node内置模块,平日存在于node安装路径lib目录下;第三方模块也就是本文论讨并望期创立的模块。

    

Require & Module path

    下面的代码中现出的require是node中载加模块的全局数函,node是如何寻找到对应模块的呢?明简规矩如下:

    

  1. 路径为Y的module中应用 require(X)
  2. 如果是X为核心模块,中命则束结
  3. 如果X以‘./’、‘/’、‘../’扫尾时,载加第三方模块,中命则束结
  4. 查找失败抛出异常

    这里能看到整完描述

    require(X) from module at path Y

    1. If X is a core module,

    a.

    return

    the core module

    b. STOP

    2. If X begins

    with

    './' or '/' or '../'

    a. LOAD_AS_FILE(Y + X)

    b. LOAD_AS_DIRECTORY(Y + X)

    3. LOAD_NODE_MODULES(X, dirname(Y))

    4. THROW "

    not found

    "

    LOAD_AS_FILE(X)

    1. If X is a file, load X as JavaScript text. STOP

    2. If X.js is a file, load X.js as JavaScript text. STOP

    3. If X.node is a file, load X.node as binary addon. STOP

    LOAD_AS_DIRECTORY(X)

    1. If X/

    package

    .json is a file,

    a. Parse X/

    package

    .json, and look

    for

    "

    main

    " field.

    b. let M = X + (json main field)

    c. LOAD_AS_FILE(M)

    2. If X/index.js is a file, load X/index.js as JavaScript text. STOP

    3. If X/index.node is a file, load X/index.node as binary addon. STOP

    LOAD_NODE_MODULES(X, START)

    1. let DIRS=NODE_MODULES_PATHS(START)

    2.

    for

    each DIR

    in

    DIRS:

    a. LOAD_AS_FILE(DIR/X)

    b. LOAD_AS_DIRECTORY(DIR/X)

    NODE_MODULES_PATHS(START)

    1. let PARTS = path split(START)

    2. let ROOT = index of first instance of "

    node_modules

    "

    in

    PARTS, or 0

    3. let I = count of PARTS - 1

    4. let DIRS = []

    5.

    while

    I > ROOT,

    a.

    if

    PARTS[I] = "

    node_modules

    " CONTINUE

    c. DIR = path join(PARTS[0 .. I] + "

    node_modules

    ")

    b. DIRS = DIRS + DIR

    c. let I = I - 1

    6.

    return

    DIRS

    

模块结构

    

    connect-header是笔者应用express期间写的一个小模块,充足简略且包含了第三方模块的诸多素元,比拟合适作为入门示例。

    

    这里用connect-header作为示例,欢送fork,样同可用下面令命安装:

    每日一道理
人的生命似洪水奔流,不遇着岛屿和暗礁,难以激起美丽的浪花。

    $ npm install connect-header

    

件文结构

    以下假设之前行执npm install的路径为X,我们看到connect-header被安装在X/node_modules/connect-header;X/node_modules是node安装第三方模块的认默置位;node已不推荐将模块安装至全局路径下,更推荐当地安装,是能可出于移植的虑考。

    

  • lib 模块代码
    • header.js 代码写在这里!
    • index.js node认默载加模块
  • test Unit Test
    • header.js
  • .npmignore 模块宣布时当地件文忽略列表
  • LICENSE 权版声明
  • package.json 模块属性声明
  • README.md 模块绍介
  • test.js UT启动脚本

    

package.json

    模块中最为主要的件文,申了明各种模块别级的属性,或称为元数据。这些元数据部份由npm程序读取,部份是npmjs.org上模块页面的数据源。整完文档请考参npm json,网上找到的一个交互文档也可考参。初次接触package.json可以应用”npm init”,这是个交互式package.json成生工具。

    $ npm init

    针对connect-header的package.json,我们分析个每字段的义意(见注释):

    {

    "

    name

    ":"

    connect-header

    ",

    //模块称名

    "

    version

    ":"

    0.0.5

    ",

    //模块本版号

    "

    description

    ":"

    General header middleware for Connect.

    ",

    "

    author

    ":{

    //模块作者息信

    "

    name

    ":"

    Luics

    ",

    "

    email

    ":"

    luics.king@gmail.com

    ",

    "

    url

    ":"

    http://github.com/luics

    "

    },

    "

    repository

    ":{

    //模块代码库

    "

    type

    ":"

    git

    ",

    "

    url

    ":"

    https://github.com/luics/connect-header.git

    "

    },

    "

    bugs

    ":{

    //Bug提交页面

    "

    url

    ":"

    http://github.com/luics/connect-header/issues

    "

    },

    "

    main

    ":"

    ./lib

    ",

    //模块进口

    "

    dependencies

    ":{

    },

    "

    devDependencies

    ":{

    //发开赖依模块

    "

    qunit

    ":"

    *

    "

    //用于unit test

    },

    "

    scripts

    ":{

    //unit test脚本

    "

    test

    ":"

    node test

    "

    },

    "

    engines

    ":{

    //赖依的node本版

    "

    node

    ":"

    >= 0.4.0

    "

    },

    "

    licenses

    ":[

    //权版息信

    {

    "

    type

    ":"

    MIT

    ",

    "

    url

    ":"

    http://www.opensource.org/licenses/MIT

    "

    }

    ],

    "

    keywords

    ":["

    connect

    ", "

    express

    ", "

    header

    ", "

    general

    "]

    }

    

README

    主要括包模块背景绍介,应用说明,sample代码,资源接连;是其他人懂得模块的主要门路,一般高品质的模块都市有一个结构清晰、绍介尽详的README;npmjs和github上的都持支markdown式格的README,一般件文后缀为mk、markdown。

    

Unit Test

    UT是其他发开者懂得模块的一个窗口,比起README,UT更加亲近模块的实现细节;平日高品质的模块也会有高品质的UT代码;UT的品质可以通过覆盖率等量衡..

    

模块宣布

    下面的令命用于宣布模块:

    $ npm publish

    初次应用“npm publish”会失败,提示要需先应用“npm adduser”添加一个npmjs.org的号账。以后每次应用“npm publish”要需手动更新package.json的version字段。

    

更多资源

    markdown-util是笔者写的另一个模块,样同比拟简略,用于将markdown源件文成生html件文,并供给了2套皮肤(github、default),持支自定义皮肤模板。更多优良资源然自都在NPM Registry中,后日也会挑出不同类型的典范模块详细分析。

    $ npm install markdown-util

    组里急招FE实习生,应聘条件请考参此处,作工点地是度百上海研发中央,有趣兴的学同请将简历发给我

文章结束给大家分享下程序员的一些笑话语录: 真正的程序员喜欢兼卖爆米花,他们利用CPU散发出的热量做爆米花,可以根据米花爆裂的速度听出正在运行什么程序。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值