[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的模块化开发和模块化加载(模块可按需加载或全部加 ...
随机推荐
- 回顾django内容
回顾: 1 HTTP协议:(重点) -请求 -请求首行 -GET /index HTTP/1.1 -请求头部(在django框架中,可以从META中取出来) -key:value------>\ ...
- bzoj3237(cdq+并查集)
这题一眼lct,然而 #include<iostream> #include<cstdio> #include<cmath> #include<cstring ...
- JavaScript基础整理
在HTML页面中嵌入JavaScript代码的三种方式 1.内嵌 写在<head>标签或<body>标签中 <script> function displayTim ...
- 解压->静态库.a文件
1. cd /Volumes/HHD/PQS/apple/Public 2. file com_PQS.a com_PQS.a: Mach-O universal binary with 5 arch ...
- python的基本数据类型(一)
一.运算符逻辑运算and:两边都真则真or:有真则真not:非假是真 顺序:()>==>not==>and>=or 二.while.. elsewhile 条件: 代码块els ...
- win7 docker Toolbox 启动Docker Quickstart Terminal 失败!
解决办法: 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败! 主要是用如下文件启动,临时解决,或设置环境变量
- 利用正则+requests爬取猫眼电影信息
import json # from multiprocessing import Pool import requests from requests.exceptions import Reque ...
- 在ASP.NET Core MVC中构建简单 Web Api
Getting Started 在 ASP.NET Core MVC 框架中,ASP.NET 团队为我们提供了一整套的用于构建一个 Web 中的各种部分所需的套件,那么有些时候我们只需要做一个简单的 ...
- 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权
[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我们介绍了网关使用Redis进行缓存,并介绍了如何进行缓存实现,缓存信息清理接口的使用.本篇我们将介绍如何实现网关自定义客户端授权, ...
- Senparc.Weixin SDK v5.0 升级公告
经过五年半的持续维护,Senparc.Weixin SDK 逐步丰满和完善,在升级的过程中,我们为基础库(Senparc.Weixin.dll)加入了许多通用的功能,例如加密/解密算法.通用缓存方法等 ...