你来到了写一个mode.js模块的舞台中央,不管你是因为自己需要写一个你自己的nodejs模块,还是你仅仅是处于好奇。无论是什么原因,在这个教程里,我将给你演示怎样创建一个nodejs模块。

nodejs 模块符合CommonJs规范的模块,都是简单的实现。相信我,通过读完这篇文章,你就能够创建一个简单的node模块。

首先,让我们看看怎样在一个app使用通过NPM安装在本地的node模块:

var easyimg = require('easyimage');

定义在easyimage模块中的方法和属性就会出现在easyimg对象中。你可以使用它们,像这样 easyimg.resize(), easyimg.crop()等等。想当方便的模块化,对不对?接下来讲述怎么为你自己创建一个。

创建一个新目录,命名为"modtest",然后cd进入这个目录:

$ mkdir modtest
$ cd modtest

创建一个文件,命名为"converter.js",做为你的模块文件:

$ vi converter.js

converter.js模块将有2个方法,一个是将输入传唤成二进制,另外一个是转换成十六进制。"converter.js"的内容是:

exports.bin = function(input) {return input.toString(2);
};exports.hex = function(input) {return input.toString(16);
};

创建另外一个文件,命名为"app.js",它将作为你的node 应用:

$ vi app.js

"app.js"的内容是:

var converter = require('./converter.js');var num = 10;var bin = converter.bin(num);
console.log('BIN:' + bin);var hex = converter.hex(num);
console.log('HEX: ' + hex);

运行这个node应用:

$ node app.js
BIN: 1010
HEX: a

至此你已经完成了它。你自己的node模块!

通过上面的例子,你能够明白:如果一个文件包含附带属性的exports,它就能够在任何app中作为一个有效模块使用。然而,我们必须指定模块文件的的路径。那样看起来很不爽,对不对?为什么不能这样写:

var converter = require('converter');

当然可以,但是我们需要把这个模块转换成正确的 NPM 包文件 并且在本地安装它。过程是非常简单的,但是需要一些改变。让我们的模块变得整洁一点。

创建一个路径,命名为"converter",重命名"converter.js"为"index.js",并且它移动到"converter"目录下:

$ mkdir converter
$ mv converter.js converter/index.js

为模块在"converter"目录先,创建一个包定义文件:

$ cd converter
$ vi package.json

"package.json"文件的内容为:

{"name": "converter","version": "0.0.1","private": true
}

给这个包,创建一个 README 文件,NPM将会解析它:

$ echo Converts stuff to BIN and HEX! > README.md

现在,你所有的设置都是为了创建一个NPM包,执行"pack"命令在当前目录:

$ npm pack
converter-0.0.1.tgz

妖怪,那里去!我们模块的NPM包就准备好了。"cd"返回到"modtes"目录下,并且从"converter"目录下安装该模块:

$ cd ..
$ npm install converter/converter-0.0.1.tgz
converter@0.0.1 ../node_modules/converter

现在你应该可以这样做:

var converter = require('converter.js');var bin = converter.binary(1337);
console.log(bin);

非常成功!你已经创建一个本地node模块 并且使用NPM安装到了你的系统里。那么接下来我们该做什么呢?

怎样发布你开创性的 node模块到线上,这样其他人就可以安装它了,使用它了,并且被它的魅力所征服?这儿是怎么在NPM的注册系统发布一个node模块。

创建一个node模块不仅仅是将属性附件到 exports对象上,然后在app文件里引用该模块。他比这稍微有点深度,我现在将解析一个模块怎么样获得它们的能量。

有2种方法来定义功能性的模块:

1、附加

在这个方法里,我把方法和属性附加到 exports对象上。export对象默认是存在的,你不需要在定义它。在我们是例子中我们使用附加的方法来创建"converter"模块。

exports.bin = function(input) {return input.toString(2);
};exports.hex = function(input) {return input.toString(16);
};

如果你需要在模块的内部调用当前模块的方法,你创建一个本地变量并把附加的属性赋值给它:

var bin = exports.bin = function(input) {return input.toString(2);
};

现在你能够调用方法bin()来代替exports.bin()在当前module 文件里。不要烦这样的错误:

bin = exports.bin = function() ...

或这样:

exports.bin = bin = function() ...

bin变量暴露到全局命令空间里!如果你想知道更多的关于全局变量和nodejs的全局命令空间,你将会喜欢Global Variables in Node.js。

2、赋值:

在这种方法里,我们分配一个javascript对象给 module.exports,它也是默认存在的在任何的被引用的模块文件中。这儿是一个使用赋值方法来创建模块的例子:

File: pi.js

module.exports = 22/7;

File: app.js

var PI = require('./pi');
console.log(PI);

注意你怎样能够忽略以".js"扩展名命名的模块。现在就是你执行app.js的时候了:

$ node app.js
3.142857142857143

注意 该模块的值怎么是PI,而不是一个含有方法和属性的对象。使用赋值方法,你的模块可以是任何有效的javascript对象-Boolean,undefined,Number,Function等等。

  一种常用的使用赋值方法的方式是返回一个function,它可以被当作class来使用:

  File: pokemon.js

module.exports = function(name, age) {this.name = name;this.age = age;this.get_name = function() {return this.name;}this.get_age = function() {return this.age;}
};

File: app.js

var Pokemon = require('./pokemon');
var pokemon = new Pokemon('Piakchu', 99);// OCD
var age = pokemon.get_age();
console.log(pokemon.get_name() + ' is ' + age + ' year' + (age == 1? '': 's')

如果你的js知识和技巧接近专家水平,那么你就能够和好的使用赋值方法来创建模块,因此确保拿出足够的时间去学习更多的javascript知识,如果你的javascript知识还不够多。

  那么以上2种那种是定义nodejs模块的最好方式?这取决于你想从模块里得到什么,以及你知道多少javascript知识。要想当一个好的node.js开发者,你首先需要是一个好的javascript开发者,因此接下来好好学习javascript!
  噢,顺便说下,你可能会喜欢我提交的这篇文章:exports vs. module.exports in Node.js

  我希望你从这篇教程里学会了你想创建nodejs模块的所有知识。如果说我错过了什么,我一直是允许评论的,所以请留言给我。

 原文: http://www.hacksparrow.com/how-to-write-node-js-modules.html

怎么样写一个 node.js模块以及NPM Package相关推荐

  1. Node.js 模块以及npm包的管理和使用

    Node.js模块系统 Node.js的模块系统是将可重用代码封装在各种模块中,减少了应用程序的代码量,模块系统提高了开发效率和代码的可读性,并且模块打包代码的方式不会改变全局作用域,开发人员可以在被 ...

  2. node mocha_如何使用Mocha和Assert测试Node.js模块

    node mocha The author selected the Open Internet/Free Speech Fund to receive a donation as part of t ...

  3. Node.js「一」—— Node.js 简介 / Node.js 模块 / 包 与 NPM

    本文为 Node.js 系列笔记第一篇.文章参考:nodejs 教程 -- 大地:<深入浅出 Node.js>:阮一峰 nodejs 博客 文章目录 一.Node 简介 1. 简单介绍 2 ...

  4. Node.js---02、node.js 模块加载机制

    2019独角兽企业重金招聘Python工程师标准>>> node.js模块分为自定义模块.扩展模块和核心模块.所有模块的加载都是通过关键字require()实现. 1.自定义模块的加 ...

  5. 编写原生的Node.js模块

    通常,我们开发原生Node.js模块包括但不仅限于以下原因: 对性能有比较苛刻要求的应用.尽管Node.js得益于libuv,在异步I/O操作很有优势,但遇到数字计算时并不是一个很好的选择. 使用更加 ...

  6. node 大写_大写Node.js模块

    node 大写 Today, let's see a third party module that helps us in working with upper-case letters witho ...

  7. node.js模块和包

    概念:模块(Module)和包(Package)是Node.js最重要的支柱.开发一个具有一定规模的程序不可能只用一个文件,通常需要把各个功能拆分.分装.然后组合起来.模块正式为了实现这种方式而诞生, ...

  8. Node.js模块以及模块加载机制

    2019独角兽企业重金招聘Python工程师标准>>> Node.js中的模块 在Node.js中,以模块为单位划分功能,通过一个完整的模块加载机制使得开发人员可以将应用程序划分为多 ...

  9. Node.js 模块之Nimble流程控制

    NodeJS异步的特性有时候会导致程序非常的难看,回调一层套着一层,这个时候就要用流程控制模块来控制究竟是同步还是异步了. Nimble是一个轻量.可移植的函数式流程控制模块.经过最小化和压缩后只有8 ...

最新文章

  1. PyTorch基础入门五:PyTorch搭建多层全连接神经网络实现MNIST手写数字识别分类
  2. 联合国2019数字经济报告
  3. java1.7环境,jdk1.7编译环境
  4. mybatis TypeHandler 类型处理器
  5. mysql mgr CONSuL_Mysql MGR + Consul + Consul-template + Haproxy 搭建mysql 高可用集群 (三)...
  6. java让两个线程交替_java两个线程实现: 两个线程交替打印字母和数
  7. Windows域策略设置 禁止客户端修改IP地址【全域策略生效】
  8. 这真有点“凶”... 开发转测试,薪资不降反升
  9. DNS在企业网络中的应用(一)
  10. pdg转pdf与djvu转pdf大法
  11. 如何挑选和购买适合自己的示波器
  12. pyhook3安装教程及与之相关的一些问题的解决方法
  13. 国际象棋渲染测试软件,C4D结合Octane Render渲染器制作三维国际象棋建模渲染教程 含中英文字幕...
  14. android app消息推送,如何进行app消息推送(push)?
  15. 实际应用Supervisor部署Flask项目
  16. 电脑蓝屏,问题:你的电脑未正确启动,按“重启”以重启你的电脑,有时这样可以解决问题,你还可以按“高级选项”,尝试使用其他选项修复你的电脑
  17. 《异常检测——从经典算法到深度学习》5 Opprentice——异常检测经典算法最终篇
  18. 开源代码学习之persepolis【二】
  19. 朱丹老师课程学习笔记:1、信息搜索-全面快速查找全网中你想要的任何信息
  20. Qt编写的复杂象棋程序 chessbroad.cpp 错误比较多

热门文章

  1. linux utf8转gbk_「正点原子Linux连载」第四章开发环境搭建(2)
  2. Linux目录结构及解释
  3. 启动级别:init 0,1,2,3,4,5,6
  4. 清华AI画虾师,想当现代齐白石
  5. 纯新手入门机器/深度学习自学指南(附一个月速成方案)
  6. 1200万!硅谷AI大牛一年赚够北京二环一套房
  7. 数据库开源 | 200人中英文混说数据库开放申请
  8. 活动合作 | 2018GAITC大会:AI领袖、应用指南、窥见风口,还能从中获得更多
  9. 小姐姐の福音!美图旗下美妆相机推出AI新功能“发型管家”
  10. 十年了,斯坦福和CMU的这场对决,开启了无人车时代