ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Node.js和CommonJs模块化的介绍、引入及使用

2020-04-18 12:06:26  阅读:352  来源: 互联网

标签:Node CommonJs console require js 模块 var tools


一、概念

1、什么是 CommonJs

JavaScript是一个强大的面向对象语言 它有很多快速高效的解释器
然而 JavaScript标准定义的API只是为了构建基于浏览器的应用程序 并没有制定一个用于更广泛的应用程序的标准库
CommonJS规范的提出主要是为了弥补当前JavaScript没有标准的缺陷
它的终极目标就是:提供一个类似Python 或 Ruby 或 Java语言的标准库 而不只是停留在脚本程序的阶段

用CommonJS API编写出的应用 不仅可利用JavaScript来开发客户端应用 还可编写如下应用:

  • 服务器端JavaScript应用程序(即NodeJs)
  • 命令行工具
  • 桌面图形界面应用程序

简单来说:CommonJs就是模块化的标准 而Nodejs就是CommonJs(模块化)的实现

2、NodeJs中的模块化

在Node中 模块分为两类 一类是Node自己提供的模块 称为核心模块 另一类是用户编写的模块 称为文件模块

  • 核心模块部分在 Node 源代码的编译过程中编译进了二进制执行文件
    在Node进程启动时 部分核心模块就被直接加载进内存中 所以这部分核心模块引入时 文件定位和编译执行这两个步骤可以省略掉
    并且在路径分析中优先判断 因此 它的加载速度是最快的
    如:HTTP 模块 URL 模块 Fs模块
    这些模块都是Nodejs内置的核心模块 可直接引入使用

  • 文件模块则是在运行时动态加载 需要完整的路径分析 文件定位 编译执行过程
    其速度相比核心模块稍微慢一些 但使用场景非常多
    此种模块需自己定义

3、CommonJS(Nodejs)中自定义模块的规定

  • 可将公共的功能抽离成为一个单独的js文件作为一个模块
    默认情况下 这个模块里面的方法或者属性 外界是没法访问的
    若要让外界可以访问模块里面的方法或者属性 则必须在模块里面通过exportsmodule.exports来暴露属性或者方法

  • 在需要使用这些模块的文件中 通过require()方法引入模块
    此时 即可使用模块里暴露的属性和方法了

模块化用到了面向对象的思想 类似于Java中的类的概念


二、案例

1、普通使用

config.js

var msg="This is Config";

// 暴露属性
module.exports=msg;

commonJs1.js

var http=require("http");

// 引入自定义的模块
var msg=require("./config.js") // 指定路径引入

var app=http.createServer(function(req,resp){

    resp.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});

    resp.write("Hello");

    console.log(msg);
    
    resp.end();
});

app.listen(8001,"127.0.0.1");

结果:
在这里插入图片描述
输出两次是因为请求了两次
一次是普通请求 另一次是favicon.ico的请求

2、小细节

tools.js

var tools={

    // 加
    add:function(x,y)
    {
        return x+y;
    },
    // 乘
    multiply:function(x,y)
    {
        return x*y;
    }

}

// 暴露方法
exports.tools=tools;

①、结构展示

commonJs2.js

// 引入自定义的模块
var tools=require("./tools.js")

console.log(tools);

输出:
在这里插入图片描述

②、调用方法

commonJs2.js

// 引入自定义的模块
var tools=require("./tools.js")

console.log(tools.tools.add(1,2));

输出:
在这里插入图片描述

③、换一种暴露方法的方式

以tools.tools的形式调用不太合理
可以换一种暴露方法的方式

tools.js

var tools={

    // 加
    add:function(x,y)
    {
        return x+y;
    },
    // 乘
    multiply:function(x,y)
    {
        return x*y;
    }

}

// 暴露方法
module.exports=tools

commonJs2.js

// 引入自定义的模块
var tools=require("./tools.js")

console.log(tools.add(1,2));
console.log(tools.multiply(4,5));

输出:
在这里插入图片描述

④、简写

省略[.js]后缀名

// 引入自定义的模块
var tools=require("./tools") // 省略[.js]后缀名

console.log(tools.add(1,2));
console.log(tools.multiply(4,5));

输出:
在这里插入图片描述

3、路径问题

①、自动寻找

当引入的模块在当前同级目录下不存在的时候
会在目录下的node_modules包下寻找

目录结构:
在这里插入图片描述
test.js

var msg="This is test";

exports.msg=msg;

commonJs4.js

var test=require("test");

console.log(test);

输出:
在这里插入图片描述

②、更深一步的自动寻找

目录结构:
在这里插入图片描述
aaa.js

var msg="aaa";

exports.msg=msg;

commonJs5.js

var aaa=require("aaa/aaa"); // 会自动从node_modules包下找

console.log(aaa);

输出:
在这里插入图片描述

③、指定 · 定位

目录结构:
在这里插入图片描述
直接通过bbb定位到bbb/bbb

此时 需要通过npm init生成package.json
在需要定位的包下输入npm init --yes强制生成package.json文件

注:一定要进入需要定位的包的目录下再执行该指令
确保package.json文件和要定位的包是同级的在这里插入图片描述
package.json
在这里插入图片描述
commonJs6.js

var bbb=require("bbb"); // 路径直接用bbb

console.log(bbb);

输出:
在这里插入图片描述

执行步骤:

bbb包在根目录不存在 因此自动去了node_modules
然后找到了bbb包 在bbb包里有package.json文件 然后会从package.json文件中找main入口
在这里插入图片描述


标签:Node,CommonJs,console,require,js,模块,var,tools
来源: https://blog.csdn.net/Piconjo/article/details/105569687

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有