RequireJs触摸

  RequireJs印象中是刚参加工作接手第二个ext项目中遇到过,很可惜当时没有认真研究过,实际上一直到今天也只是停留在知道它可以做什么而已。年底了工作渐渐进入休整期,前天不经意看到博客园一大神讨论requirejs和ASP.NET MVC Bundling异同,忽然又想起了requirejs,于是决定一探究竟,下面记录这两天的(断断续续的~~你懂得)学习成果。

1.RequireJs能做什么?

  1). 防止页面加载js时阻塞页面渲染

       2). 模块化加载js,避免出现页面多引用、依赖js问题

2.认识RequireJs

使用RequireJs加载模块化的js,define定义模块且模块需返回

//DefineJs模块
define(function(){ var DefineJs={ MyAlert:function(msg){ alert('sean '+msg) } } return DefineJs;//必须返回 })

注:我们可以在定义模块的时候添加依赖

//依赖jquery的模块
define(["jquery"],function($){ var MyJs={ MyAlert:function(msg){ var opt={id:1,name:'sean',msg:'hi sean'}; $.extend(opt,{msg:'hi '+msg}) alert(opt.msg) } } return MyJs;//必须返回 })

html页面如何使用模块js?RequireJs引用到页面时可以添加data-main属性指定模块入口main.js再此可以省略后缀,相当于main函数,async="true"是异步加载避免阻塞,defer是针对IE浏览器功能和async一样。

<!DOCTYPE html>
<html>
<head>
    <title>RequireJs实践</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>

<script src="js/require.js" data-main="js/main" defer async="true" ></script>
</body>
</html>

main.js   conffig配置用到哪些模块

//main.js
require.config({ baseUrl:
'js/', paths : { myfunc: 'DefineJs' //DefineJs模块 } }) require(["myfunc"],function(r){ r.MyAlert('你好') // sean 你好 })

实际开发中我们会引用很多jquery插件而且这些插件未必就是define()模块化的,那该如何使用RequireJs呢?

RequireJs提供shim关键字将依赖的js某个全局变量暴露出来当做模块引用

//不符合AMD规范 UnAMD.js

var consol=function (argument) {
  var opt={
    id:1,
    name:'sean'
  }
  $.extend(opt,{name:argument})
  console.info(opt)
}

main.js稍作修改

//main.js
require.config({ baseUrl:
'js/', paths : {
  jquery :["http://libs.baidu.com/jquery/2.0.3/jquery"],
myfunc: 'DefineJs'//DefineJs模块 }, shim: {//不符合AMD js UnAMD: { deps : ["jquery"], //依赖jquery exports : "consol"//输出的对象必须和相关js中的全局变量一致 封装成对象 } } }) require(["jquery",'UnAMD'],function($,con){ $(function(){ con('月明星惜');//控制台输出 对象{id:1,name:'月明星惜'} }) })

/*===========================RequireJs简单介绍到此结束==================================*/

注意事项:

defing 命名模块

仔细看jquery发现且在定义模块时是这样的 define( "jquery", [], function() { return jQuery; }); 根据上面介绍我们知道define定义模块时这个模块可以是依赖别的模块的也就是第二个参数数组,那么第一个参数是什么意思呢?其实定义模块是可以强制性定义模块名称,而且在require.config中不可以修改模块名称,所以配置时一定要注意这种已命名的模块。

requirejs.config({
  baseUrl: '/public/js',
  paths: {
    myjquery: 'lib/jquery/jquery'//重新自定义jquery模块名称 
  }
});
requirejs(['myjquery'], function($) {
  //do sth      程序报错  $ is undefined
});

 

学无先后,达者为师
原文地址:https://www.cnblogs.com/seanchang/p/8438702.html