I have written about the source code analysis of require and sea in my previous blog. What I want to share today is a very simple core code (about 60 lines without comments and blank lines), without fault tolerance judgment.
require.js
require function implementation can be summarized in one sentence:
Load the require modules in sequence, then monitor the onload event of the script, determine that all modules are loaded successfully, and execute the require callback. If there is only one parameter and it is not an array, It is to return the module after loading successfully.
//标记已经加载成功的个数 var REQ_TOTAL = 0; //模块导出 window.exports = {}; //记录各个模块的顺序 var exp_arr = []; //判断是否数组 function isArray(param) { return param instanceof Array; } //require 真正实现 function require(arr, callback) { var req_list; if(isArray(arr)) { req_list = arr; } else { req_list = [arr]; } var req_len = req_list.length; //模块逐个加载 for(var i=0;i<req_len;i++) { var req_item = req_list[i]; var $script = createScript(req_item, i); var $node = document.querySelector('head'); (function($script) { //检测script 的onload事件 $script.onload = function() { REQ_TOTAL++; var script_index = $script.getAttribute('index'); exp_arr[script_index] = exports; window.exports = {}; //所有链接加载成功后,执行callback if(REQ_TOTAL == req_len) { callback && callback.apply(exports, exp_arr); } } $node.appendChild($script); })($script); } } //创建一个script标签 function createScript(src, index) { var $script = document.createElement('script'); $script.setAttribute('src', src); $script.setAttribute('index', index); return $script; }
Then I wrote 2 js files for the export module, and only wrote the simplest exports implementation
define.js
exports.define = { topic: 'my export', desc: 'this is other way to define ', sayHello: function() { console.log('topic ' + this.topic + this.desc); } }
define2.js
exports.define = { name: 'xm', age: 22, info: function() { console.log('topic ' + this.name + this.age); } }
Then test The demo is very simple
//测试demo require(['../res/define.js', '../res/define2.js'], function(def, def2) { def.define.sayHello(); def2.define.info(); });