详解RequireJS按需加载样式文件


Posted in Javascript onApril 12, 2017

样式模块化的好处

RequireJS被设计用来加载JavaScript模块的,可是大家有没有联想到其实样式文件可以进行模块化处理,那么问题来了,RequireJS能不能像加载脚本文件一样来加载样式文件呢?

虽然RequireJS本身没有实现这个功能,但官网推荐了一些常用的插件供我们使用,官网插件插件地址为:http://requirejs.org/docs/plugins.html,同时在github上也有社区大量贡献的插件:https://github.com/jrburke/requirejs/wiki/Plugins

当然除了引用第三方插件外,我们也可以动手自己写一个类似插件,不过我在这里要推荐一个很不错的样式模块加载器require-css,其官网地址为:https://github.com/guybedford/require-css。

那么我们再来谈谈,样式模块话的好处吧,和脚本模块化一样,样式模块化也可以做到按需加载,样式依赖,不过对我来说最大的好处是将脚本的管理放权到前端管理,为什么这么说呢? 以前我们添加样式文件都是通过link标签引入的,而被引入的文件基本上都是jsp、php等后台文件,这样对与后台不太熟悉的人来说,如果样式文件发生改变,都要麻烦后台开发人员。但是最懂样式的莫过于前端开发人员了。

require-css的使用介绍

下面我们通过一个简单的例子,来介绍下require-css的用法,首先下载require-css,去到上面给出的官网地址,在页面的右下角点击Download ZIP按钮,下载完成后解压,将css.js拷贝复制到项目中去。

这个简单示例的目录如下所示:

详解RequireJS按需加载样式文件

假设我们的目的是,通过加载util模块时,页面先加载其依赖的样式文件1.css。这个需求我们经常遇到,比如我们使用JqueryUI时,在加载其脚本模块时,在页面我们也会添加上link标签引入其相关的UI样式文件。

首先我们在project.html中引入RequireJS和指定配置文件(main.js)的位置。期代码如下所示:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>RequireJS简单示例</title>
</head>
<body>
  <p id="test">如何处理依赖问题</p>
  <script src="scripts/lib/jquery-1.11.0.min.js"></script>
  <script src="scripts/require.js" data-main="scripts/main"></script>
</body>
</html>

我们进入到main.js配置文件。main.js应该是页面的入口文件,在这个入口文件中,指定了入口文件需要加载的模块,同事也设置了RequireJS某些具体参数。其代码如下所示:

/*入口脚本*/
require.config({
  baseUrl: "scripts/",
  paths: {
    "util": "helper/util"
  },
  waitSeconds: 15,
  map: {
    '*': {
      'css': 'lib/css'
    }
  },
  shim : {
    'util': ['css!../style/1.css']
  }
});

require(["util"], function(util) {
  // todo
});

其中我们要特别注意map和shim的配置,"map"告诉RequireJS在任何模块之前,都先载入这个模块,这样别的模块依赖于css!../style/1.css这样的模块都知道怎么处理了,shim那时干什么用的呢?这这个示例中,他表示util这个模块在加载之前需要先加载1.css这个样式文件。当然我们也可以在Util模块里直接设置他的依赖,下面将会解释。

下面我们来看看util模块的代码,代码如下所示:

define(function(){
  //alert("Hello RequireJS!!");
  console.log($("#test").text());
});

这个模块很简单,就是通过jQuery获取页面id为test的值。并且在浏览器的控制台输出来。这里你可能感觉有点奇怪。为什么你使用了jQuery但是在依赖数组中且没有设置呢?正确的说,我们应该这样写:

define(['jquery'],function(){
  //alert("Hello RequireJS!!");
  console.log($("#test").text());
});

我这样做的目的是,用RequireJS打包时,不要将jquery打包进去,这样就可以减少文件的大小了。还有一个上面提出的问题,加入我不用shim这个配置时,可以向依赖JQuery一样,将样式文件写到define的依赖数组中去。其代码如下:

define(['css!../style/1.css'],function(){
  //alert("Hello RequireJS!!");
  console.log($("#test").text());
});

不过你应该一眼就能看出来,那种写法比较好吧,我比较推荐,将依赖写到shim配置中去。

一切配置就绪,在浏览器中打开project.html页面,运行结果如图所示:

详解RequireJS按需加载样式文件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery实现的鼠标滑过按钮改变背景图片
Jul 15 Javascript
jQuery响应enter键的实现思路
Apr 18 Javascript
js实现瀑布流效果(自动生成新的内容)
Mar 16 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
May 20 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
Jul 24 Javascript
JS+Ajax实现百度智能搜索框
Aug 04 Javascript
Vue 进入/离开动画效果
Dec 26 Javascript
浅谈一个webpack构建速度优化误区
Jun 24 Javascript
javascript将扁平的数据转为树形结构的高效率算法
Feb 27 Javascript
Element Backtop回到顶部的具体使用
Jul 27 Javascript
React实现动效弹窗组件
Jun 21 Javascript
交互式可视化js库gojs使用介绍及技巧
Feb 18 Javascript
JS表格组件神器bootstrap table使用指南详解
Apr 12 #Javascript
详谈jQuery.load()和Jsp的include的区别
Apr 12 #jQuery
微信小程序开发之选项卡(窗口底部TabBar)页面切换
Apr 12 #Javascript
JavaScript模块化之使用requireJS按需加载
Apr 12 #Javascript
使用jQuery和ajax代替iframe的方法(详解)
Apr 12 #jQuery
微信小程序 仿美团分类菜单 swiper分类菜单
Apr 12 #Javascript
jQuery用noConflict代替$的实现方法
Apr 12 #jQuery
You might like
PHP中iconv函数知识汇总
2015/07/02 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
浅谈JS继承_借用构造函数 &amp; 组合式继承
2016/08/16 Javascript
JS仿JQuery选择器功能
2017/03/08 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
js实现缓动动画
2020/11/25 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
django ajax json的实例代码
2018/05/29 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
HTML5手机端弹出遮罩菜单特效代码
2016/01/27 HTML / CSS
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
几个数据库方面的面试题
2016/07/01 面试题
理财计划书
2014/08/14 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
爱国主题班会教案
2015/08/14 职场文书
Java界面编程实现界面跳转
2022/06/16 Java/Android
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript