[JavaScript] 前端模块加载简单实现(require)
模块加载的简单实现
(function(win) {
var baseUrl;
var paths;
var script_cache = {};
var script_queue = [];
var setConfig = function(options) {
if (!options) {
options = {
baseUrl: "/",
paths: {}
};
}
if (options.baseUrl) baseUrl = options.baseUrl;
if (options.paths) paths = options.paths;
};
// 用来创建script标签并且添加到body上
var _createScript = function(script_name) {
var scrpit_element = document.createElement("script");
var fs = document.getElementsByTagName("script")[0];
scrpit_element.setAttribute("id", script_name);
scrpit_element.setAttribute("type", "text/javascript");
scrpit_element.setAttribute("src", baseUrl + paths[script_name]);
fs.parentNode.insertBefore(scrpit_element, fs);
return scrpit_element;
};
var _saveScript = function(script) {
script.status = "loaded";
script_cache[script.name] = script;
};
var _queue = function() {
var save_script = script_queue[0];
if (script_queue[0]) {
var script = document.getElementById(script_queue[0].name);
if (script) {
if (script_queue.length > 0) {
script_queue.splice(0, 1);
_queue();
} else {
return script_queue[0].callback();
}
} else {
var script = _createScript(script_queue[0].name);
script.onload = script.onreadystatechange = function() {
_saveScript(script_queue[0]);
script_queue.splice(0, 1);
if (script_queue.length <= 0) {
save_script.callback();
} else {
_queue();
}
};
}
} else {
return;
}
};
var depends = function(script_names, callback) {
if (Object.prototype.toString.call(script_names) !== "[object Array]") {
if (script_names) {
script_names = [script_names];
} else {
script_names = [];
}
}
script_names.forEach(function(item) {
script_queue.push({
name: item,
status: "start",
callback: callback
});
});
_queue();
};
var getCache = function() {
return script_cache;
};
win.ki = {
getCache,
setConfig,
depends
};
})(window);
之后引入 js 文件

//init.js
ki.setConfig({
baseUrl: "lib/",
paths: {
jquery: "jquery.js",
underscore: "underscore.js"
}
});
ki.depends(["jquery", "underscore"], function() {
// rgba(0,0,0);
var color = ["rgba(", Math.floor(Math.random() * 255), ",", Math.floor(Math.random() * 255), ",", Math.floor(Math.random() * 255), ")"];
$(".background").css({
position: "fixed",
top: "0px",
bottom: "0px",
left: "0px",
right: "0px",
background: color.join("")
});
window._.each([1, 2, 3, 4, 5], function(item) {
console.log(item * 33);
});
});
[JavaScript] 前端模块加载简单实现(require)的更多相关文章
- JavaScript AMD 模块加载器原理与实现
关于前端模块化,玉伯在其博文 前端模块化开发的价值 中有论述,有兴趣的同学可以去阅读一下. 1. 模块加载器 模块加载器目前比较流行的有 Requirejs 和 Seajs.前者遵循 AMD规范,后者 ...
- webpack前端模块加载工具
最近在看许多React的资料,发现了大部分的项目都是用webpack行模块化管理的工具.这次也是借着写了一个React-Todos的小应用,对webPack最基本实用的功能体验了一番,顺带做个小记录. ...
- javascript 异步模块加载 简易实现
在javascript是没有类似java或其他语言的模块概念的,因此也不可能通过import或using等关键字来引用模块,这样造成了复杂项目中前端代码混乱,变量互相影响等. 因此在复杂项目中引入AM ...
- javascript之模块加载方案
前言 主要学习一下四种模块加载规范: AMD CMD CommonJS ES6 模块 历史 前端模块化开发那点历史 require.js requirejs 为全局添加了 define 函数,你只要按 ...
- 前端模块加载规范AMD与CMD小记
AMD代表:requirejs: CMD代表:seajs: AMD CMD 代表 requirejs seajs 执行 提前加载,不管是否调用模块,先解析所以模块 提前加载,在真正需要使 ...
- 关于javascript模块加载技术的一些思考
前不久有个网友问我在前端使用requireJs和seajs的问题,我当时问他你们公司以前有没有自己编写的javascript库,或者javascript框架,他的回答是什么都没有,他只是听说像requ ...
- 彻底搞清楚javascript中的require、import和export(js模块加载规范的前世今生)
为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持”类”(class),所以也 ...
- 【模块化编程】理解requireJS-实现一个简单的模块加载器
在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...
- 转: javascript模块加载框架seajs详解
javascript模块加载框架seajs详解 SeaJS是一个遵循commonJS规范的javascript模块加载框架,可以实现javascript的模块化开发和模块化加载(模块可按需加载或全部加 ...
随机推荐
- ajax轮询与长轮询
刚刚网了关于轮询的知识,必须拿到自己这里来做个备份了! 其实以前用ajax轮询做个及时数据更新的,只是当时做了不知道那个就是轮询. 首先我们什么时候会想到用轮询技术呢? 一般而言,最多的是及时信息 ...
- search
|—search()—|—添加一个列表变量Expend,存储每个小格扩展时为第几步,可打印出 | |—打印运动表 |—A*—|— heuristic() |—Dy ...
- IntelliJ IDEA的main方法,for循环,syso的快捷键
原文链接:http://blog.csdn.net/tiantiandjava/article/details/42269173 今天偶然发现了IntelliJ中 创建main函数的快捷键,依次还有f ...
- Timer of STM32
下面是STM32得定时器程序,分两个文件Timer.c和Timer.h /*************************************************************** ...
- jquery1.6中的.prop()和.attr()异同
jquery jQueryHTML5JavaScript浏览器ITeye 最近在iteye的新闻中看到jQuery已经更新到了1.6.1.和之前版本的最大变化是增加了.prop方法.但是.prop( ...
- FPGA计算中定标与位扩展的实现
我不知道名字取对没有,在FPGA计算中有时往往需要在不溢出的情况下将数扩大,从而获得更好的计算精度. 比如.在一个8位宽的系统中,将x=0000_0010,算术左移m=5位之后得到xt=0100_00 ...
- [转] Linux 内核中的 Device Mapper 机制
本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...
- 你可以这么理解五种I/O模型
因为项目需要,接触和使用了Netty,Netty是高性能NIO通信框架,在业界拥有很好的口碑,但知其然不知其所以然. 所以本系列文章将从基础开始学起,深入细致的学习NIO.本文主要是介绍五种I/O模型 ...
- es5
var arr1=["上海","北京","广州"]; var arr2=[12,22, 33,58,32,45,92]; // 数组.方法( ...
- SpringBoot 项目打包后运行报 org.apache.ibatis.binding.BindingException
今天把本地的一个SpringBoot项目打包扔到Linux服务器上,启动执行,接口一访问就报错,但是在本地Eclipse中启动执行不报错,错误如下: org.apache.ibatis.binding ...