随着javascript的兴起,越来越多的公司开始将JS模块化,以增加开发的效率和减少重复编写代码的。更是为了能更加容易的维护日后的代码,因为现在的随着人们对交互效果的越来越强烈的需求,我们的JS代码也从以前的几十行代码,慢慢的发展到了现在的几百甚至上千过万,但是要怎么才能把这些代码很好的整合起来呢?

面向对象的编程方法应该是目前最为流行的编程方式,将所有代码都模块化,不仅有利于增加我们开发效率,而且还使我们代码更容易维护。今天就推荐一个目前比较流行的require.js库,用来编写javascript模块化倒是不错的一个选择,以下是我的一些学习总结,希望对大家学习这个库有点帮助

require.js主要特色功能

我们现在写JS一般一个站点最少都会有两到三个JS文件,多则七八个JS文件都很正常。看下淘宝的首页加载的JS文件数量:

是不是非常的惊人,巨多的文件,面对这样的多的JS文件,说实在的很头疼,而且许多JS文件是有依赖性的,例如:

<script type="text/javascript" src="1.js"></script>
<script type="text/javascript" src="2.js"></script>
<script type="text/javascript" src="3.js"></script>

像上面这样的JS文件,2.js文件要依赖与1.js文件,3.js又要依赖前面两个js文件,他们之间的先后顺序还不能出现错误,否则JS就会报错。像上面这样一个页面需要如此多的JS文件,对我们使用他们的功能时其实是种负担,因为调用一个功能的时候我们需要加载多个JS文件,而且调用JS的顺序必须按照顺序。除了这个问题,我还不知道,我们调用的这些JS会不会跟其他JS发生冲突,这就更加坑爹了

但是上面这些问题,require.js可以很好的解决:

  • 实现js文件的异步加载,避免网页失去响应;

  • 管理模块之间的依赖性,便于代码的编写和维护。

导入require.js文件方法

首先大家可以到require.js的官网去下载最新的文件包。下载完以后我们把require.js放到我们的JS文件目录下,然后把它加载到页面上:

  1. <script src="js/require.js" defer async="true" ></script>

我们上面给这个JS加了两个额外的属性:deferasync,这两个属性主要是为了让浏览器能在页面元素全部加载完以后再加载JS,我称这个为异步加载JS,这种方法可以避免因为加载JS时页面卡住,出现假死的状态,所以我们让先让页面呈现出来,然后在加载JS,相当于平常我们把JS放到页面底部原理差不多。上面defer属性是因为IE不支持async,所以加上的。

加载require.js以后,下一步就要加载我们自己的JS文件了。假如我们自己的代码文件是main.js,也放在JS目录下面。那么,只需要写成下面这样就行了:

  1. <script src="js/require.js" data-main="js/main"></script>

data-main属性的作用是,指定网页程序的主模块。在上例中,就是js目录下面的main.js,这个文件会第一个被require.js加载。由于require.js默认的文件后缀名是js,所以可以把main.js简写成main。

require.js配置文件方法

我们的JS文件不单单是只要main.js这个文件,我们还需要加载其他文件,这时候我们只需要在main.js这个文件里面编写好你需要另外加载的JS文件,这时我们要用他的require()函数,这个函数有两个参数:第一个参数是一个数组,表示所依赖的模块;第二个参数是一个回调函数,当前面指定的模块都加载成功后,我们将调用它;

  1. require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
  2.     //回调成功后的操作
  3. });

上面模块会按照你填写的先后顺序异步加载到页面中:A,B,C。加载成功后才会执行操作代码。这样就可以防止页面出现假死的状况了。

可能有很多的人JS都是依赖一些框架来写的,这时候我们就需要加载例如jquery等库进来的时候,我们就可以这样写:

  1. requirejs(['jquery', 'canvas', 'app/sub'],
  2. function   ($,canvas,sub) {
  3. //jQuery, canvas and the app/sub module are all
  4. //loaded and can be used here now.
  5. });

看上面的代码,jquery他会自动去寻找jquery.js文件,所以你想加载成功你的jquery你就需要将他命名为jquery.js这样才行。但是如果希望你的jquery文件可以带版本号,require.js也可以满足你的需求,它提供了require.config()的函数,可以让我们自定义一些路径,文件名称。我们可以这样写代码:

  1. require.config({
  2.   paths: {
  3.     "jquery": "jquery-1.8.3.min",
  4.   }
  5. });

请记住一点,我们的文件名不需要加.js后缀,否则require.js会找不到文件的。

看到上面的代码,有些人可能还会问,如果我的JS文件不是跟main.js在同一个目录的时候怎么办?方法和上面的差不多,直接改目录,假设我们jquery放在JS文件夹下面的libs目录下面时,我们可以这样写:

  1. require.config({
  2. paths: {
  3. jquery: 'libs/jquery-1.8.3.min'
  4. }
  5. });

还可以用另外一种写法,直接改变基目录:

  1. requirejs.config({
  2. baseUrl: 'js/lib',
  3. paths: {
  4. jquery: 'jquery-1.8.3.min'
  5. }
  6. });

require.js模块化编程方法

require.js的所有模块必须采用特定的define()函数的来定义。如果一个模块不依赖其他模块,那么就可以直接定义在define()函数中。例如:

  1. //main.js
  2. define({
  3. color: "black",
  4. size: "unisize"
  5. });

调用上面方法:

  1. //main.js
  2. require(['main'], function (main){
  3. console.log(main.color); //black
  4. console.log(main.size);  //unisize
  5.   });

如果我们要编写函数,我们可以这样写:

  1. define(function (){
  2.   var Total = function (x,y){
  3.     return x+y;
  4.   };
  5.   return {
  6. total: Total
  7.   };
  8. });

调用上面的代码:

  1. //main.js
  2. require(['main'], function (main){
  3. console.log(wnf.total(5,10));
  4.   });

require.js加载的模块,采用AMD规范。也就是说,模块必须按照AMD的规定来写。具体来说,就是模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中

如果这个模块还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。

  1. define(['jquery'], function(){
  2.   var foo = function(){
  3.       $("body").click(function(){
  4. alert("jquery");
  5. });
  6.   }
  7.   return {
  8.       foo : foo
  9.   };
  10. });

然后我们调用上面的方法:

  1. //main.js
  2. require(['main'], function (main){
  3. main.foo();//jquery
  4.   });

上面是我的学习笔记,看完你应该能对require.js有些了解,如果想更详细的了解这个库的功能,建议大家可以到require.js官网去进行深入了解学习。

转载请注明来自 520UED http://www.520ued.com/article/538830e8b992a7c43f5c204d

javascript模块化编程库require.js的用法的更多相关文章

  1. Javascript模块化编程:require.js的用法

    摘自:http://blog.jobbole.com/30046/ 这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库 ...

  2. Javascript模块化编程(三)require.js的用法及功能介绍

    这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战.我采用的是一个非常流行的库require.js感兴趣的朋友可以了解下啊 我采用的是一个非常流行的 ...

  3. Javascript模块化编程-require.js

    转自:https://www.cnblogs.com/digdeep/p/4607131.html Javascript模块化编程(一):模块的写法 随着网站逐渐变成"互联网应用程序&quo ...

  4. JavaScript模块化编程之require.js与sea.js

    为什么要模块化:当今,网站以不再是一个简单的页面,JavaScript也不再是做一些简单的脚本验证,随着WEB.20时代到来,前端工程师面临的必将是越来越庞大的JavaScript代码,越来越复杂的内 ...

  5. Javascript模块化编程(三):require.js的用法

    Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...

  6. (转)Javascript模块化编程(三):Require.js的用法

    转自 ruanyifeng 系列目录: Javascript模块化编程(一):模块的写法 Javascript模块化编程(二):AMD规范 Javascript模块化编程(三):Require.js的 ...

  7. Javascript模块化编程require.js的用法

    JS模块化工具requirejs教程(一):初识requirejs http://www.runoob.com/w3cnote/requirejs-tutorial-1.html JS模块化工具req ...

  8. javascript模块化编程(三):require.js用法

    本文来自阮一峰 这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require ...

  9. Javascript模块化编程(三):require.js的用法(转)

    这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的 ...

随机推荐

  1. win10汇编如何debug(小白向)

    先引用别人的方法 http://blog.csdn.net/lcr_happy/article/details/52491107 按他所说的下完对应软件后,安装其中的dosbox,然后将debug.e ...

  2. Linux开机时停在 Starting sendmail 不动了的解决方案

    目前遇到这个问题,是在修改了/etc/hosts之后,但停止在Starting sendmail后5分钟就进去了.以后再长时间进入不了系统,可以参考下面的方法. 造成这个问题一般是因为用户修改了机器名 ...

  3. 面向对象_03【关键字:final使用】

    final关键字:可修饰类.变量名和方法1,final修饰的类不能被继承2,final修饰的变量(成员.局部)是常量,只能赋值一次.3,final修饰的方法不能被子类重写Example:一:修饰类 / ...

  4. 使用Filebeat和Logstash集中归档日志

    方 案 Filebeat->Logstash->Files Filebeat->Redis->Logstash->Files Nxlog(Rsyslog.Logstash ...

  5. 解决C#编译中"csc不是内部或外部命令"的问题

    安装完 VisualStudio 编译环境后,是不能用命令行直接编译写好的csc文件的,如果不配置环境变量,在命令提示符(cmd)中编译扩展名为cs的文件,会出现错误提示"csc不是内部或外 ...

  6. mysql(4)—— 表连接查询与where后使用子查询的性能分析。

    子查询就是在一条查询语句中还有其它的查询语句,主查询得到的结果依赖于子查询的结果. 子查询的子语句可以在一条sql语句的FROM,JOIN,和WHERE后面,本文主要针对在WHERE后面使用子查询与表 ...

  7. img的属性alt 与 title的区别

    当我们给图片加属性的时候,初学时,可能会弄混淆alt与title的区别,那么这两个的区别,我们可以从本意来看—— alt原词是“Alternate”,切换,替换的意思.常用的输入法切换会用到alt键进 ...

  8. JavaScript中的类继承

    JavaScript是一个无class的面向对象语言,它使用原型继承而非类继承.这会让那些使用传统面向对象语言如C++和Java的程序员们感到困惑.正如我们所看到的,JavaScript的原型继承比类 ...

  9. CSS中的选择器之html选择器和伪类选择器

    1.html选择器(标签选择器) 基本语法: html标签名称{ 属性名:属性值; 属性名:属性值; } 继续在上面的代码中做修改,实例代码: <!DOCTYPE html> <ht ...

  10. 【linux之简介】

    一.操作系统是什么 1.定义 操作系统,英文名称Operating System,简称OS,是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心. ...