博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nodejs 如何开发 module、npm package——directory + index.js + package.json!
阅读量:6155 次
发布时间:2019-06-21

本文共 3933 字,大约阅读时间需要 13 分钟。

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

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

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

 

[javascript]
  
 
  1. var easyimg = require('easyimage');  

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

 

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

 

[javascript]
  
 
  1. $ mkdir modtest  
  2. $ cd modtest  

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

 

 

[javascript]
  
 
  1. $ vi converter.js  

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

 

 

[css]
  
 
  1. exports.bin = function(input) {  
  2.     return input.toString(2);  
  3. };  
  4.   
  5. exports.hex = function(input) {  
  6.     return input.toString(16);  
  7. };  

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

 

 

[javascript]
  
 
  1. $ vi app.js  

     "app.js"的内容是:

 

 

[javascript]
  
 
  1. var converter = require('./converter.js');  
  2.   
  3. var num = 10;  
  4.   
  5. var bin = converter.bin(num);  
  6. console.log('BIN:' + bin);  
  7.   
  8. var hex = converter.hex(num);  
  9. console.log('HEX: ' + hex);  

      运行这个node应用:

 

 

[javascript]
  
 
  1. $ node app.js  
  2. BIN: 1010  
  3. HEX: a  

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

 

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

 

[javascript]
  
 
  1. var converter = require('converter');  

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

 

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

 

[javascript]
  
 
  1. $ mkdir converter  
  2. $ mv converter.js converter/index.js  

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

 

 

[javascript]
  
 
  1. $ cd converter  
  2. $ vi package.json  

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

 

 

[javascript]
  
 
  1. {  
  2.   "name": "converter",  
  3.   "version": "0.0.1",  
  4.   "private": true  
  5. }  

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

 

 

[javascript]
  
 
  1. $ echo Converts stuff to BIN and HEX! > README.md  

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

 

 

[javascript]
  
 
  1. $ npm pack  
  2. converter-0.0.1.tgz  

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

 

 

[javascript]
  
 
  1. $ cd ..  
  2. $ npm install converter/converter-0.0.1.tgz   
  3. converter@0.0.1 ../node_modules/converter  

      现在你应该可以这样做:

 

 

[javascript]
  
 
  1. var converter = require('converter.js');  
  2.   
  3. var bin = converter.binary(1337);  
  4. console.log(bin);  

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

 

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

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

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

   1、附加

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

 

[javascript]
  
 
  1. exports.bin = function(input) {  
  2.     return input.toString(2);  
  3. };  
  4.   
  5. exports.hex = function(input) {  
  6.     return input.toString(16);  
  7. };  

 

 

 

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

 

 

[javascript]
  
 
  1. var bin = exports.bin = function(input) {  
  2.     return input.toString(2);  
  3. };  

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

 

 

[javascript]
  
 
  1. bin = exports.bin = function() ...  

    或这样:

 

 

[javascript]
  
 
  1. exports.bin = bin = function() ...  

 

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

   2、赋值:

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

   File: pi.js

 

[javascript]
  
 
  1. module.exports = 22/7;  

  File: app.js

 

 

[javascript]
  
 
  1. var PI = require('./pi');  
  2. console.log(PI);  

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

 

 

[javascript]
  
 
  1. $ node app.js  
  2. 3.142857142857143  

   

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

 

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

  File: pokemon.js

 

[javascript]
  
 
  1. module.exports = function(name, age) {  
  2.   
  3.     this.name = name;  
  4.     this.age = age;  
  5.       
  6.     this.get_name = function() {  
  7.         return this.name;  
  8.     }  
  9.       
  10.     this.get_age = function() {  
  11.         return this.age;  
  12.     }  
  13. };  

   File: app.js

 

 

[javascript]
  
 
  1. var Pokemon = require('./pokemon');  
  2. var pokemon = new Pokemon('Piakchu', 99);  
  3.   
  4. // OCD  
  5. var age = pokemon.get_age();  
  6. console.log(pokemon.get_name() + ' is ' + age + ' year' + (age == 1? '': 's')  

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

 

  那么以上2种那种是定义nodejs模块的最好方式?这取决于你想从模块里得到什么,以及你知道多少javascript知识。要想当一个好的开发者,你首先需要是一个好的javascript开发者,因此接下来好好学习javascript!

  噢,顺便说下,你可能会喜欢我提交的这篇文章:

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

 原文: 

转载地址:http://mhffa.baihongyu.com/

你可能感兴趣的文章
原创:goldengate从11.2升级到12.1.2
查看>>
Quartz
查看>>
正则表达式的语法规则
查看>>
C#一个关于委托和事件通俗易懂的例子
查看>>
类似于SVN的文档内容差异对比工具winmerge
查看>>
Cause: java.sql.SQLException: The user specified as a definer ('root'@'%') does not exist
查看>>
quratz线程
查看>>
execnet: rapid multi-Python deployment
查看>>
windows修改3389端口
查看>>
关于JavaScript词法
查看>>
FreeSwitch中的会议功能(4)
查看>>
MySQL中创建用户分配权限(到指定数据库或者指定数据库表中)
查看>>
SQL 求解每月周末天数
查看>>
C 里面 ---变量名-- 和 --地址-- 的关系探讨 <转>
查看>>
zabbix api 批量添加主机(python3 requests)
查看>>
js 控制<input type=textarea/>输入字数限制
查看>>
java的main函数为什么没有返回值
查看>>
Hint
查看>>
实现购物车加减计价功能
查看>>
dup等复制文件描述符函数
查看>>