关于commonjs:CommonJS的两种导出方式

晓得的敌人应该晓得,CommonJS有两种导出形式,如下所示: // module1.jsconst name1 = 'Ben';const name2 = 'Lisa'// 导出形式1module.exports = { name1, name2,};// 导出形式2exports.name1 = name1;exports.name2 = name2;差别那么下面这两种导出形式有什么差别呢?先说论断,从导出的后果来看,没有差别。 import module1 from './module1.js'// 无论module1.js中应用的哪种形式导出,这里失去的module1都是一样的构造。console.log(module1)// { name1, name2 }为什么没有差别至于为什么两者没有差别,起因也很简略。module.exports和exports是相等的,因为exports就是援用自module.exports。 const name = 'Ben';// 这两个写法是等价的exports.name = namemodule.exports = { name }看下图,给exports增加一个name属性,也就是相当于给module.exports增加了一个属性。 留神防止意外切断援用关系不要应用上面的导出形式,还记得exports是援用自module.exports吗,上面这种写法,相当于切断了exports和module.exports的援用关系,所以也就无奈导出了。 const name = 'Ben';exports = { name}防止同时应用两种形式const name1 = 'Ben';const name2 = 'Lisa'// 导出形式1module.exports = { name1,};// 导出形式2exports.name2 = name2;下面同时存在两种导出形式的状况,会导致导出形式2会被疏忽。 还记得他们的援用关系吗?导出形式1将援用关系切断了,所以就会导致导出形式2失败。

February 20, 2024 · 1 min · jiezi

关于commonjs:CommonJS模块分类及加载流程及模块加载模拟实现

模块分类内置模块:Node源码编译时写入到二进制文件中文件模块:代码运行时,动静加载加载流程路径分析:根据标识符确定模块地位(门路标识符、非门路标识符)文件定位:确定指标模块中具体的文件及文件类型(存在'm1'模块,导入时应用require('m1')语法,应用m1.js->m1.json->m1.node的程序,如果都没找到,会被当做一个目录,查找package.json文件,应用JOSN.parse()解析。接下来会找main.js->main.json->main.node。将index作为指标模块中的具体文件名称)编译执行:采纳对应的形式实现文件的编译执行(将某个具体类型的文件依照相应的形式进行编译和执行,创立新对象,按门路载入,实现编译执行,返回可用exports对象)缓存优先准则 进步模块加载速度以后模块不存在,则经验一次残缺加载流程模块加载实现后,应用门路作为索引进行缓存模块加载模仿实现外围逻辑 路径分析缓存优化文件定位编译执行依据下面的加载流程特色模仿实现 const fs = require("fs");const path = require("path");const vm = require("vm");function Module(id) { this.id = id; this.exports = {};}// 静态方法Module._resolveFilename = function (filename) { // 利用path将filename转为绝对路径 let absPath = path.resolve(__dirname, filename); console.log(absPath); // 判断以后门路对应的内容是否存在 if (fs.existsSync(absPath)) { // 条件成立阐明absPath对应的内容是存在的 return absPath; } else { // 依据文件定位的程序顺次去找 let suffix = Object.keys(Module.__extensions); for (var i = 0; i < suffix.length; i++) { // 拼接 let newPath = absPath + suffix[i]; if (fs.existsSync(newPath)) { return newPath; } } } throw new Error(`${filename} is not exists`);};Module.__extensions = { ".js"(module) { // 读取 let content = fs.readFileSync(module.id, "utf-8"); // 包装 content = Module.wrapper[0] + content + Module.wrapper[1]; // 应用vm执行 let compileFn = vm.runInThisContext(content); // 转换成一个可执行匿名函数 // 筹备参数的值 let exports = module.exports; let dirname = path.dirname(module.id); let filename = module.id; // 调用 compileFn.call(exports, exports, myRequire, module, filename, dirname); }, ".json"(module) { // 读取而后格式化 let content = JSON.parse(fs.readFileSync(module.id, "utf-8")); module.exports = content; },};Module.wrapper = [ "(function(exports,require,module,__filename,__dirname){", "})",];Module._cache = {};Module.prototype.load = function () { let extname = path.extname(this.id); console.log("extname", extname); Module.__extensions[extname](this);};function myRequire(filename) { // 1,获取绝对路径 let modulePath = Module._resolveFilename(filename); // 2,实现缓存优先 let cacheModule = Module._cache[modulePath]; if (cacheModule) { return cacheModule.exports; } // 3创立空对象加载指标模块 let module = new Module(modulePath); // 4,缓存曾经加载的模块 Module._cache[modulePath] = module; // 5,执行加载(编译执行) module.load(); // 6 ,返回数据 return module.exports;}let obj = myRequire("./m");console.log(obj);

May 1, 2022 · 1 min · jiezi

关于commonjs:分析如何将excel表格电话号码导入手机通讯录

当你的手里有一个excel表格,外面有铭单,几百个、几千个、甚至几万个,你想把他们疾速批量存入手机通讯录,不论你是安卓手机还是苹果手机,跟着上面的操作方法,这里通过借助于网络上常见的软件,金芝号码提取导入助手,来做演示如何一键批量疾速导入号码,我这里仅仅几步和几分钟即可搞定。 (1)把你的excel表格在电脑上关上,就像我下图那样,铭字和号码筹备好,没有铭字也没有关系,照样能够导入,间接多复制一遍就能够。申明:我下图的资料是虚构的,并非实在,仅作为解说导入过程应用。 (2)把铭字和号码,别离复制好,各自粘贴到软件,金芝号码提取导入助手,第一个框和第二个框,放好了当前,点下方的“转换通信禄”,即可进去一个文件,把它保留到电脑桌面,同时起个好记的文件名比方abc,这样待会好认好找。 (3)把上一步转换好的放在电脑桌面的文件abc,发送给你的手机,能够借助电脑某信或者电脑球球,发送给你的手机某信或者手机球球,这是两种常见的传送文件的形式,个别的人都懂。 (4)在你的手机上,点开方才接管到的文件,抉择“其余利用形式关上”,顺着提醒一步步操作即可实现。安卓手机,选“分割仁”或者“电括本”或者“拨号与分割仁”等常见的选项,确定导入。苹果手机,下方有个“通信禄”,就选它,存储,导入确定。 下面就是通过借助网络上常见的便捷软件,金芝号码提取导入助手,来做残缺具体的四步解说,操作的过程其实很快,花不了几分钟就能够将excel表格电话号码导入手机通讯录,导入的过程也是高度自动化的,很容易就能搞定的。

March 5, 2022 · 1 min · jiezi

import和require的区别

关于 import 和 require 的不同,其实可以理解成 CommonJs 和 ES Module 的区别。这两者都是前端模块化的规范。 我们在 node 里使用的是 CommonJs,在前端页面的时候,用的是 ES Module,这两者的区别,还是很容易混淆的,所以整理一下 CommonJs 和 ES Moudule 的相关知识点,把这里好好的整理一下。 一、CommonJs 1.1 概述 Nodejs 是 CommonJS 规范的主要实践者,在 CommonJs 里每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。CommonJs 提供了四个重要的环境变量为模块化的实现提供支持:module、exports、require、global。CommonJS 规定,每个模块内部,module 变量代表当前模块。这个变量是一个对象,它的 exports 属性(即 module.exports )是对外的接口。加载某个模块,其实是加载该模块的 module.exports 属性。 var x = 5;var addX = function (value) { return value + x;};module.exports.x = x;module.exports.addX = addX;而使用 require 方法来引入并加载模块 var example = require('./example.js');console.log(example.x); // 5console.log(example.addX(1)); // 61.2 CommonJS模块的特点 ...

July 3, 2020 · 2 min · jiezi