记录commonjs的一道面试题

  • 如下代码,写出这段代码的导出结果
ini 复制代码
// 2.js
this.a = 1;
exports.b = 2;
exports = {
    c: 3,
}
module.exports = {
    d: 4,
}
exports.e = 5;
this.f = 6;
  • 在其他文件导入2.js,可以看到导入结果
javascript 复制代码
// 1.js
const r = require('./2');
console.log(r)
  • 看下require函数做了什么
javascript 复制代码
function require(modulePath){
    // 根据模块的url,判断模块完整的绝对路径
    var moduleId = getModuleId(modulePath);
    // 判断缓存
    if(cache[moduleId]){
        return cache[moduleId];
    }
    // 运行模块代码的辅助函数
    function _require(exports, require, module, __filename, __dirname){
        // 目标模块在这里运行
    }
    var module = {
        exports: {},
    }
    var exports = module.exports;
    //模块文件的绝对路径
    var __filename = moduleId;
    // 获取模块所在目录的绝对路径
    var __dirname = getDirname(__filename);
    _require.call(exports,exports,require,module,__filename,__dirname);
    
    // 添加缓存
    cache[moduleId] = module.exports;
    
    // 返回结果
    return module.exports;
}
  • 知道require的实现应该知道打印的结果了
相关推荐
qq_406176141 小时前
详解Vue中的计算属性(computed)和观察属性(watch)
开发语言·前端·javascript·vue.js·前端框架
kyriewen1 小时前
Grid 网格布局:二维世界的布局王者,像下围棋一样掌控页面
前端·css·html
顽固_倔强1 小时前
Vue2 与 Vue3 对比:从 Options API 到 Composition API 的演进
前端·面试
巫山老妖1 小时前
用 OpenClaw 每日自动发布 AI 速递:微信公众号 + 小红书全流程实操
前端
兆子龙2 小时前
V8 与 JavaScript 执行:从字节码、Ignition 到 TurboFan JIT 的完整管线
前端
CHU7290352 小时前
家政同城服务APP前端功能玩法解析
前端·小程序
兆子龙2 小时前
React Fiber 调度器源码解析:从 workLoop 到 commit 的完整渲染链路
前端·javascript
LQE2 小时前
Vue 2 vs Vue 3:全面对比指南
前端
用户350144817922 小时前
数据对比中的”平等性原则“
前端