模块加载的简单实现

(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)的更多相关文章

  1. JavaScript AMD 模块加载器原理与实现

    关于前端模块化,玉伯在其博文 前端模块化开发的价值 中有论述,有兴趣的同学可以去阅读一下. 1. 模块加载器 模块加载器目前比较流行的有 Requirejs 和 Seajs.前者遵循 AMD规范,后者 ...

  2. webpack前端模块加载工具

    最近在看许多React的资料,发现了大部分的项目都是用webpack行模块化管理的工具.这次也是借着写了一个React-Todos的小应用,对webPack最基本实用的功能体验了一番,顺带做个小记录. ...

  3. javascript 异步模块加载 简易实现

    在javascript是没有类似java或其他语言的模块概念的,因此也不可能通过import或using等关键字来引用模块,这样造成了复杂项目中前端代码混乱,变量互相影响等. 因此在复杂项目中引入AM ...

  4. javascript之模块加载方案

    前言 主要学习一下四种模块加载规范: AMD CMD CommonJS ES6 模块 历史 前端模块化开发那点历史 require.js requirejs 为全局添加了 define 函数,你只要按 ...

  5. 前端模块加载规范AMD与CMD小记

    AMD代表:requirejs:    CMD代表:seajs:   AMD CMD 代表 requirejs seajs  执行  提前加载,不管是否调用模块,先解析所以模块 提前加载,在真正需要使 ...

  6. 关于javascript模块加载技术的一些思考

    前不久有个网友问我在前端使用requireJs和seajs的问题,我当时问他你们公司以前有没有自己编写的javascript库,或者javascript框架,他的回答是什么都没有,他只是听说像requ ...

  7. 彻底搞清楚javascript中的require、import和export(js模块加载规范的前世今生)

    为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持”类”(class),所以也 ...

  8. 【模块化编程】理解requireJS-实现一个简单的模块加载器

    在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...

  9. 转: javascript模块加载框架seajs详解

    javascript模块加载框架seajs详解 SeaJS是一个遵循commonJS规范的javascript模块加载框架,可以实现javascript的模块化开发和模块化加载(模块可按需加载或全部加 ...

随机推荐

  1. sftp修改用户home目录后登录时报connection closed by remote host

    在sftp用户需要修改登录根目录的情况下,我们可以修改/etc/ssh/sshd_config文件中ChrootDirectory /home/[path]的路径. 但是,在重启sshd服务后,sft ...

  2. 打造自己Django博客日记

    本教程使用的开发环境 本教程写作时开发环境的系统平台为 Windows 10 (64 位),Python 版本为 3.5.2 (64 位),Django 版本为 1.10.6. 建议尽可能地与教程的开 ...

  3. php中的冒泡排序和选择排序d

    //冒泡算法 //定义一个数组  $arr=arr{2,5,1155,3,8}; $len=count($arr); for($i=0;$i<$len-1;$i++) //定义以下需要宣传的次数 ...

  4. Vue两种组件类型介绍:递归组件和动态组件

    一递归组件 递归组件的特性就是可以在自己的template模板中调用自己本身.值得注意的它必须设置name属性. // 递归组件 recursive.vue <template> < ...

  5. RabbitMQ 使用主题进行消息分发

    在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...

  6. 剑指offer面试题25:二叉树中和为某一值的路径

    题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从根节点开始往下一直到叶节点所经过的节点形成一条路径. 解题思路:当使用前序遍历的方式访问某一节点时,把该节点添加到路径上 ...

  7. 9.视差特效、回弹动画、overScrollBy

    视差特效 * 应用场景: 微信朋友圈, QQ空间, 微博个人展示,向下拉出,松开回弹* 功能实现: > 1. 重写overScrollBy > 2. 松手之后执行动画, 类型估值器 .  ...

  8. Kali学习笔记7:三层发现

    三层发现:发送ICMP/IP数据包探测 第一种方式: 就是很简单的Ping命令: 不过linux的ping命令和windows的ping命令不一样,它会默认不停止地发数据包 我们可以通过-c参数来设置 ...

  9. mysql数据统计技巧备忘录

    mysql 作为常用数据库,操作贼六是必须的,对于数字操作相关的东西,那是相当方便,本节就来拎几个统计案例出来供参考! order订单表,样例如下: CREATE TABLE `t_order` ( ...

  10. vue脚手架中使用axios

    虽然之前用过n次,但大多都是直接在页面中引入axios.js的.今天想换种方式使用,一时间竟不知道怎么配置了.特此记录下. 1.npm 安装axios,文件根目录下安装,指令如下:  npm inst ...