Node.js从白痴到入门(三):模块

什么是nodejs里的模块?

我们写程序的时候一般会把比较复杂而又低耦合的代码会封装到一起,nodejs也不例外。nodejs里的模块包括内部的模块,如我们前面使用的http、fs、querystring等等;第三方npm模块,这部分可以用npm命令进行安装,安装到项目下的node_modules目录下,此部分的模块和业务不相关;我们自己的和业务相关的模块,此部分可以封装到项目目录里面。

如何创建一个模块

最简单的模块就是直接引用一个js文件。我们直接在项目根目录下创建一个a.js文件,只写一个打印语句:

console.log("这是a.js模块") 

在入口test.js文件引入:

require("./a");  // “./a”指是的控制台目录下的a.js文件(我们控制台是在项目根目录下启动的)

执行后我们可以发现a.js里面的代码被执行了。

如何暴露模块的接口

我们知道一个模块肯定是要向外暴露一下接口来给外部调用的,暴露接口使用exports关键词,新建一个b.js向外暴露m、n变量和一个fun方法:

exports.m = 10;
exports.n = 100;

exports.fun = function(){
    console.log("这是b.js模块中的函数");
};

在test.js中去引用:

require("./a");
var b = require("./b");

console.log("m="+b.m);
console.log("n="+b.n);
b.fun();

模块暴露一个类(整个模块就暴露一个类)

nodejs默认会暴露一个空的类,此时会接收所有的exports暴露的东西,但一但module.exports接收了属性、方法或者类之后所有的exports暴露的东西都无效了。
我们新建一个ClassC.js:

function ClassC(x,y,z){
    this.x = x;
    this.y = y;
    this.z = z;
}

ClassC.prototype.fun = function() { // 向ClassC添加一个fun函数
    console.log("这是ClassC.js模块中的fun函数: x="+this.x+" y="+this.y+" z="+this.z);
};

module.exports = ClassC;

在text.js中引入:

require("./a");
var b = require("./b");
var ClassC = require("./ClassC");

console.log("m="+b.m);
console.log("n="+b.n);
b.fun();

// 这里的ClassC不是模块暴露的ClassC也不是模块文件名ClassC
// 而是引包时定义的var ClassC,这里只是约定俗成的使用模块名作为变量名
var classC = new ClassC(1,2,3);  
classC.fun();

多个文件打包成一个模块

通常我们一个模块会包含很多文件,如果直接散列在项目中,那画面一定很美。我们可以创建一个文件夹m,在m文件夹里面新建一个index.js,在index.js中暴露接口,外部只需引入m文件夹nodejs会自动的引入m文件夹里面的index.js

function M(){
}

M.prototype.fun = function() { // 向ClassC添加一个fun函数
    console.log("这是M模块中的fun函数");
};

module.exports = M;
require("./a");
var b = require("./b");
var ClassC = require("./ClassC");
var M = require("./M");

console.log("m="+b.m);
console.log("n="+b.n);
b.fun();

// 这里的ClassC不是模块暴露的ClassC也不是模块文件名ClassC
// 而是引包时定义的var ClassC,这里只是约定俗成的使用模块名作为变量名
var classC = new ClassC(1,2,3);
classC.fun();

var m = new M();
m.fun();

此时你可能会问,那如果我现在在根目录下再创建一个m.js模块呢?此时require("./M")引入的会是m.js,js文件优先级高于文件夹(大小写不铭感)。

直接暴露一个函数

使用module.exports直接暴露一个函数,在引入模块后可以直接加括号传参,不需要加“.”:

module.exports = function(a,b){
    ...
}

// 使用
var fun = require("./xxx"); // 引入上面的模块

fun(1,2);                   // 可以直接当成函数直接调用

源码

点鸡下崽

如何下载使用第三方的npm模块

npm(nodejs package management)是随nodejs一起安装的包管理器,原先是nodejs爱好者搭建的,后来被nodejs收录。我们可以在npm官网下载或发布模块。
在代码中只需要使用“npm install 模块名”命令就能下载npm上的模块,下载后会放在项目目录下的node_modules目录中(npm官网可能会比较慢,可以使用淘宝镜像安装)。
引用node_modules目录下的模块不需要加模块路径,node_modules目录可以在项目目录中的任意一个父路径中(逐级往上查找)。

项目依赖

可能你有发现,有些目录厦门有一个package.json文件,这个文件是标明了当前项目(当前目录)的属性和依赖的模块。如果没有这个文件可以使用npm init命令来创建一个package.json文件(如果不需要修改直接一路回车即可),创建这个文件的好处是在文件中注明依赖之后项目迁移不需要打包node_modules文件夹(这个一般比较大),迁移后只需要使用npm install来安装即可,npm会自动下载项目中的依赖模块(依赖的依赖也会下载)。如:

{
  "name": "icebreak",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.17.1",
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.3",
    "ejs": "~2.5.6",
    "express": "~4.15.2",
    "morgan": "~1.8.1",
    "serve-favicon": "~2.4.2"
  }
}

具体的项表示的意思可以参考官方文档是说明。
在安装npm包的时候加上“-save”(npm install 模块名 -save)会自动在package.json加上依赖。

全局安装

npm全局安装的一般是命令行工具,在安装时加上-g(npm install 模块名 -g)。
如grunt、webpack、gulp、less等等,这些工具一般不需要跟随项目,但也可以作为项目的开发工具依赖(devDependencies)。
使用npm root -g可以查看全局安装的路径。

一些npm命令

npm install:安装所有依赖
npm install 模块名:安装
npm uninstall 模块名:卸载
npm update 模块名:更新
npm publish 模块名:发布到npm

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容