从易到难,写一个JavaScript加载器之一

先上代码:

 1 (function(global) {
 2   var createScript, insertScript, makeLoadQueue;
 3   createScript = function(src) {
 4     var script;
 5     script = document.createElement(‘SCRIPT‘);
 6     script.src = "" + src + ".js";
 7     return script;
 8   };
 9   insertScript = function(scriptQueue) {
10     var script;
11     script = scriptQueue.shift();
12     if (script != null) {
13       document.head.appendChild(script);
14       return script.onload = function() {
15         return insertScript(scriptQueue);
16       };
17     } else {
18       return false;
19     }
20   };
21   makeLoadQueue = function(loadList) {
22     var loadQueue;
23     loadQueue = [];
24     loadList.forEach(function(src) {
25       return loadQueue.push(createScript(src));
26     });
27     return loadQueue;
28   };
29   return global.jsLoader = {
30     load: function(loadList) {
31       var queue;
32       queue = [];
33       queue = makeLoadQueue(loadList);
34       return insertScript(queue);
35     }
36   };
37 })(window);

这个实例,展示了通过一个预制的清单文件 loadlist.js,来按照顺序同步加载script脚本文件

直接引用的方式:

<!-- jQuery 2.1.4 -->
<script src="lib/admin-lte/plugins/jQuery/jQuery-2.1.4.min.js" type="text/javascript"></script>
<!-- Bootstrap 3.3.2 JS -->
<script src="lib/admin-lte/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<!-- iCheck -->
<script src="lib/admin-lte/plugins/iCheck/icheck.min.js" type="text/javascript"></script>
<!--angular-->
<script src="lib/angular/angular.min.js"></script>
<script src="lib/angular-ui-router/angular-ui-router.min.js"></script>
<script src="lib/angular-animate/angular-animate.min.js"></script>
<!--不带watchers的数据绑定指令-->
<script src="//cdn.bootcss.com/angular-bindonce/0.3.1/bindonce.min.js"></script>

使用这个库的方式:

<script src="public/jsLoader/jsLoader.js"></script>
<script src="loadList.js"></script>

loadList:

(function (global) {
    var loadList = [
        ‘lib/admin-lte/plugins/jQuery/jQuery-2.1.4.min‘,
        ‘lib/admin-lte/bootstrap/js/bootstrap.min‘,
        ‘lib/admin-lte/plugins/iCheck/icheck.min‘,
        ‘lib/angular/angular.min‘,
        ‘lib/angular-ui-router/angular-ui-router.min‘,
        ‘lib/angular-animate/angular-animate.min‘,
        ‘//cdn.bootcss.com/angular-bindonce/0.3.1/bindonce.min‘,
        //main
        ‘app‘
    ]
    global.jsLoader.load(loadList);
})(window);

对比html中的引入,改进了 代码的可读性和项目的可维护性了,并通过动态创建script,以非阻塞方式加载了js.

下一篇文章则改进这个库,使之能够同样的方式并行加载css

时间: 2024-12-24 02:32:58

从易到难,写一个JavaScript加载器之一的相关文章

Canvas---Canvas图像加载、利用javascript回调机制实现一个图片加载器

canvas的drawImage方法有个缺点,就是当图片还未加载完成时调用它将无效. 当然,在高速运转的游戏主循环中,可以直接忽略这个问题,或者用 img.complete == true来做下判断. 在游戏循环之外的地方,可以用 img.onload = function (){};这样的回调解决. 但是,如果需要实现预先大量图片的加载,并且将加载进度告知用户,这时就需要一个图片加载器. 一.图片加载器原理 1.对于每张图片,开启对应的一个线程去负责加载,加载完成后修改一个变量的值-loade

Sea.js 是一个模块加载器

1 模块定义define define(function(require,exports,module){ //require 引入需要的模块如jquery等 //var $ = require('./jquery'); //exports可以把方法或属性暴露给外部 exports.name = 'hi'; exports.hi = function(){ alert('hello'); } //module提供了模块信息 }); 2 使用定义好的模块seajs.use <!doctype ht

浏览器端的javascript加载器

commonJS,定义了一种同步加载脚本的规范.对于浏览器端而言,因为js脚本都是在远端,用同步的方式可能会长时间阻塞线程.因此,浏览器端的js加载器并不会严格按照commonJS来做.seajs作为一个试图遵循commonJS规范的加载器,是在规范的基础上在外面包一层define,来异步加载js,以下是seajs官网的一个例子: // 所有模块都通过 define 来定义 define(function(require, exports, module) { // 通过 require 引入依

一个小小的加载器的雏形

<!doctype html> <html> <head></head> <body> <script> function createScript(str,callFunc,callArgument){ var myScript = document.createElement("script"); myScript.src = str; document.body.appendChild(myScript);

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

关于前端模块化,玉伯在其博文 前端模块化开发的价值 中有论述,有兴趣的同学可以去阅读一下. 1. 模块加载器 模块加载器目前比较流行的有 Requirejs 和 Seajs.前者遵循 AMD规范,后者遵循 CMD规范.前者的规范产出比较适合于浏览器异步环境的习惯,后者的规范产出对于写过 nodejs 的同学来说是比较爽的.关于两者的比较,有兴趣的同学请参看玉伯在知乎的回答 AMD和CMD的区别有哪些.本文希望能按照 AMD 规范来简单实现自己的一个模块加载器,以此来搞清楚模块加载器的工作原理.

如何构建一个微型的CMD模块化加载器

前言 前端模块化是一个老生常谈的话题,模块化的好处是不言而喻,比如易于代码复用.易于维护.易于团队开发d等云云.对于前端模块加载器,以前仅仅止步于会用的阶段,为了加深对前端模块化的理解,大概花了一周的时间来学习.调研并尝试自己实现一个简易版的符合CMD规范的加载器. 设计 加载器是按照CMD规范进行设计的,具体的CMD规范就不列出了,详情请见CMD规范. 入口函数 use(ids, callback) 模块定义函数 define(factory) 模块加载函数 require(id) 取得模块接

AMD加载器实现笔记(一)

之前研究过AMD,也写过一篇关于AMD的文章<以代码爱好者角度来看AMD与CMD>.代码我是有看过的,基本的原理也都明白,但实际动手去实现却是没有的.因为今年计划的dojo教程<静静的dojo>中,有一章节来专门讲解AMD,不免要把对AMD的研究回炉一下.时隔多日,再回头探索AMD实现原理时,竟抓耳挠腮,苦苦思索不得要领.作为开发人员,深感惭愧.故有此文,记录我在实现一个AMD加载器时的思考总结. requireJS是所有AMD加载器中,最广为人知的一个.目前的版本更凝聚了几位大牛

模块加载器

模块加载器 最近在做新项目的时候自己利用一点业余时间写了一个简单的js模块加载器.后来因为用了webpack就没有考虑把它放到项目里面去,也没有继续更新它了.模块加载器开源的有很多,一般来说seaJS和reqiureJS都能满足基本需求.本篇博文主要分享一下卤煮写这个加载器的一些想法和思路,作为学习的记录. js模块化加载已经不是一个新鲜概念了,很多人都一再强调,大型项目要使用模块化开发,因为一旦随着项目的增大,管理和组织代码的难度会越来越难,使得我们对代码的管理变得重要起来.当然,在后端模块化

[源码]Python免杀ShellCode加载器(Cobaltstrike/Metasploit)

0x001 原理 采用分离法,即将ShellCode和加载器分离.方法较LOW但免杀. 本文主要将ShellCode转成HEX,再通过加载器执行ShellCode. PS: 何为SC加载器,即专门用于加载所提供ShellCode的工具. 如同HTTP发包工具,支持提交HTTP,写死参数最多只能叫EXP. 再详细点,打个比方,你只会炒一个菜,你敢说你是厨师吗? 0x002 ShellCode免杀 CS可生成很多种格式的ShellCode,具体该用哪一种呢? 由于部分杀软会查杀ShellCode文件