RequireJS解决代码依赖问题,异步加载js,避免页面失去相应
2017-03-20 22:06
525 查看
RequireJS的目标是鼓励代码的模块化,它使用了不同于传统
<script>标签的脚本加载步骤。可以用它来加速、优化代码,但其主要目的还是为了代码的模块化。它鼓励在使用脚本时以module ID替代URL地址。
RequireJS以一个相对于baseUrl的地址来加载所有的代码。 页面顶层
<script>标签含有一个特殊的属性data-main,require.js使用它来启动脚本加载过程,而baseUrl一般设置到与该属性相一致的目录。
加载
<script data-main="main" src="./require.js"></script>
这里的mian是脚本的入口,相当于c语言的main()主函数, 所有的模块都要集中在这里被解析. 默认加载的都是js文件,所以就不用加.js
<script src="js1.js""></script> <script src="js2.js""></script> <script src="js3.js""></script> <script src="js4.js""></script>
之前我们引用js代码就会是这样, 依赖顺序不能颠倒, 这样就非常麻烦,
AMD规范
//AND规范的写法 require(['依赖一', '依赖二', '依赖三'], function(依赖一的别名, 依赖三的别名, 依赖三的别名){ //code })
require很好的解决了这个代码依赖的问题,它采用AMD(异步模块加载)规范加载脚本文件.
比如:
require(['jquery', 'underscore', 'bankbone'], function($, _, Backbone) { //code })
配置
有的模块肯定是不符合AMD规范的,那么我们就需要配置一下,shim属性就是配置不符合AMD规范的代码的,require.config()参数是一个对象,写在页面的最顶部.require.config({ baseUrl: '路径', // 设置js文件的根目录,默认是main.js的目录,这里写相对与main.js的相对路径 paths: { jquery: '路径' // 为每个文件单独指定路径, 也可以是网络地址 } shim: { '模块名': { exports: '模块别名', deps: ['依赖一', '依赖二'] } } })
AMD模块的写法
define(['依赖'], function(依赖别名) { //code })
define(function(a, b) { var add = function(a, b) { return a + b; } return add }); //这样写只能返回一个方法 //在main.js里用该模块的名字(a,b)调用
还可以用下面的方法写
define(function(a, b) { var add = function(a, b) { return a + b; } var x = function(a, b) { return a * b } return { add: add, x: x } }); //这样写只能返回多个方法 //在main.js里用该模块的名字.add(a,b)或者模块名字.x(a,b)调用
模块的压缩合并
模块化的写法肯定会增加文件数量, 从而增加请求次数, 放慢加载速度, require有自带的压缩工具r.js, 可以合并所有模块为一个js文件. 可以去官网下载也可以使用bower下载
bower install r.js
下载完后在main.js的目录新建一个build.js文件(配置如下)
在build.js的文件目录下执行node r.js -o build.js
构建完后会有一个main-built.js文件
这里有一篇详细介绍打包的文章
({ appDir: './', //项目根目录 out: 'main-build.js', //输出文件名 dir: './outdir', //输出目录,全部文件打包后要放入的文件夹(如果没有会自动新建的) /* 有了dir,就不能使用out配置项了,你在编译时它有非常明确的提示 */ baseUrl: './js/pages', //相对于appDir,代表要查找js文件的起始文件夹,下文所有文件路径的定义都是基于这个baseUrl的 modules: [ //要优化的模块 —— 里面的配置项即各页面的 相对baseUrl路径的 省略后缀“.js”的 入口文件(入口文件 ---- 即加载页面时引入require.js的script标签上data-main属性所指定的文件) //该属性必不可少,因为一个程序至少需要有一个入口 { name:'main'}, { name:'index'} ], fileExclusionRegExp: /^(r|build)\.js|.*\.scss$/, //正则匹配过滤文件,匹配到的文件将不会被输出到输出目录去,这里过滤掉的是 r.js、build.js、*.scss三类文件 optimizeCss: 'standard', removeCombined: true, //如果为true,优化器将从输出目录中删除已合并的文件 paths: { //各模块相对baseUrl的路径,直接从require.config的path配置中烤取即可 "underscore": "../libs/underscore/underscore-min", "backbone": "../libs/backbone/backbone-min", }, shim:{// 配置不符合AMD规范的模块,直接从require.config的shim配置中烤取即可 "underscore": { exports: "_" }, "backbone": { deps: ["underscore", "jquery"], exports: "Backbone" }, } })
相关文章推荐
- 如何使用 require.js ,实现js文件的异步加载,避免网页失去响应,管理模块之间的依赖性,便于代码的编写和维护。
- vue.js加载页面出现闪烁问题的解决
- 通过二次加载脚本,解决Ajax加载的页面中JS脚本不执行问题
- 微信浏览器页面js刷新页面代码,解决微信jquery无法刷新问题
- WEB页面在输出JS的代码后变形的问题解决方法
- 异步加载页面,页面中的js的调用问题
- webview加载页面,JS方法不能加载的问题解决
- 解决JS 模块之前的异步按需加载问题 框架 (Sea.js ,require.js)
- 关于angular的include指令,include的页面无法加载js问题解决
- 解决用jquery load加载页面到div时,不执行页面js的问题
- 解决了在某个页面的js代码中替换另外一个frame中页面的问题
- 解决使用Vue.js显示数据的时,页面闪现原始代码的问题
- dwzjs在firefox下遇到页面加载问题解决方法
- 巧妙解决js内容调用导致页面加载慢的问题
- 解决HTML加载时,外部js文件引用较多,影响页面打开速度问题
- JQuery 解决用load加载页面到div时,不执行页面js的问题
- FragmentTabHost切换Fragment时避免重复加载UI,导致切换后重绘页面的问题解决
- requirejs页面刷新失效js报错问题解决方案
- 解决用jquery load加载页面到div时,不执行页面js的问题
- dwzjs在firefox下遇到页面加载问题解决方法