专栏首页前端一会Nodejs中模块的创建与引用

Nodejs中模块的创建与引用

nodejs中,模块的概念很重要。所有功能都是基于模块划分的。每个模块都是JavaScript脚本,核心模块中主要是由js写成,部分是由C/C++编写,内建模块多是由C/C++编写。

这些模块的调用遵循CommonJS规范。

使用require()加载模块文件,参数值是字符串,如非nodejs自有模块,需要指定模块文件的完整路径及文件名。可以使用相对路径./或绝对路径/

// count.js  count模块文件
function count( a, b ) {
    return a*2 + b;
}
module.exports = {
    count
}

// app.js 业务代码文件
const countModule = require( "./count" );
let res = countModule.count( 10, 2 );
console.log( res );     // 22

如果count模块文件不存在,require()函数会将抛出一个异常。

通常在模块内部定义的本地就是、函数或对象只能在该模块内部访问,但当需要从模块外部引用这些变量、函数或对象时,需要用到代表当前模块文件的module对象的exports属性,这个module.exports属性就是模块的对象接口。换句话说,加载某个模块,其实就是加载该模块的module.exports属性。弄明白这个,就可以将需要被在模块外引用的变量、函数和对象放在module.exports属性的值中。

// some.js 模块文件
module.exports = {
    someValName: someVal,
    someFnName : someFn,
    someObjName: someObj
}

// app.js  调用some模块的文件,假设与some.js共在一个目录下
let some = require( "./some.js" );
console.log( some.someValName );

module.exports属性的值可以是一个对象,也可以是一个类(其实就是构造函数啦)。当模块输出了一个类,那可以干的事也非常多,比如类静态方法、静态变量、成员方法、成员变量…

// Foo模块文件  foo.js
function Foo( name, age ){
    this.name = name;
    this.age = age;
}

Foo.prototype.getName = function () {
    return this.name;
}
Foo.prototype.setName = function ( newName ) {
    this.name = newName;
}
Foo.prototype.getAge = function () {
    return this.age;
}
Foo.prototype.setAge = function ( newAge ) {
    this.age = newAge;
}
module.exports = Foo;

// 业务文件  app.js
const Foo = require( "./foo" );

let foo = new Foo( "nitx", 31 );
console.log( foo.getName() );       // nitx
console.log( foo.getAge() );        // 31

foo.setName( "sxm" );
foo.setAge( "32" );

console.log( foo.getName() );       // sxm
console.log( foo.getAge() );        // 32

上面两个示例都是属于第三方模块,引用时需要指定文件路径,如果不想指定文件路径,而直接引用文件名,如nodejs核心模块引用那样require( "http" ),则需要将模块文件放到node_modules目录下。这种方式管理模块更为灵活方便,可以在node_modules目录下新建一个使用该模块命名的目录,再将该模块文件放置在这个子目录下,并将模块文件重命名为index.js即可,应用程序根目录下的node_modules子目录的foo目录下的index.js将被正确加载。

参考资料:

1. 《Node.js》权威指南 - 第4章 模块与npm包管理工具 2. 前端模块化详解(完整版):https://juejin.im/post/5c17ad756fb9a049ff4e0a62

本文分享自微信公众号 - 前端小二(frontendxiao2),作者:小二君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《深入浅出Node.js》:node的模块规范与模块实现

    Node的目标是成为一个构建快速、可伸缩的网络应用平台,通过通信协议来组织许多Node,非常容易通过扩展来达成构建大型网络应用的目的。

    前端_AWhile
  • jQuery源码研究:模块规范兼容

    从jq官网down下最新的未压缩版代码并打开后,首先看下整体,这就是一个大型的自执行的匿名函数:

    前端_AWhile
  • 《你不知道的JavaScript》:js构造函数的假面

    在js中[[Prototype]]属性最常出现的地方构造函数添加“原型方法”上面了。

    前端_AWhile
  • 什么是scratch?

    2007年,一款儿童编程软件scratch风靡全球。目前,超过 150 个不同国家或地区的人在使用scratch学习编程。 scratch是麻省理工学院媒体实验...

    企鹅号小编
  • Python模块

    Python模块 可以将代码量较大的程序分割成多个有组织的、彼此独立但又能相互交互的代码片段,这些自我包含的有组织的代码段就是模块 模块在物理形式上表现为以.p...

    企鹅号小编
  • Python 模块和包

    注意 如果 两个模块,存在 同名的函数,那么 后导入模块的函数,会 覆盖掉先导入的函数

    Devops海洋的渔夫
  • Angular 2 模块(Modules)

    孙亖
  • 微信 Android 模块化架构重构实践(下)

    重构整体架构不是一件容易事,通常也不太可能让整个团队停下来只做重构。本文是微信 Android 模块化架构重构实践的下篇,主要分享模块化架构重构的一点点经验。

    微信终端开发团队
  • FPGA之激励文件(testbench)的简单分析

    第1行是仿真的一个时间刻度,“/”前面的1ns代表的是时间单位,后面的1ns是时间精度,很多时候在使用工具生成模块的代码时,出现的是1ns/1ps,而我喜欢把1...

    狂人V
  • 2-2 什么是模块打包工具

    关于模块和模块化,百度百科有一段引用自《Java应用架构设计:模块化模式与OSGi》一书的解释非常好:

    love丁酥酥

扫码关注云+社区

领取腾讯云代金券