模块化

在前端使用模块化开发,可以将代码根据功能实施模块的划分,每个模块功能(职责)单一,在需要更改对应的功能的时候,只需要对指定的模块进行修改,其他模块不受任何影响。

为什么要进行前端模块化?

  1. 达到公共模块的复用
  2. 可以很好的解决全局变量污染的问题
  3. 可以很好的解决各个功能之间的依赖关系

如何实现前端模块化开发

JavaScript本身不支持模块化开发,但是可以通过一些手段来实现。

CommonJS是一个规范,用来规定模块化开发的标准。

CommonJS由于一系列的限制,在前端开发当中,并不能很好的被实现。

Nodejs中对于CommonJS这个规范有很好的实现。

CommonJS虽然不能再前端开发中很好进行实现,但是后面有人在CommonJS的基础上做了其他的改变。

AMD Async Module Define (require.js) 也是一个规范,在CommonJS的基础上产生的 //依赖前置

CMD Common Module Define (sea.js) [玉伯] 也是一个规范,在CommonJS的基础上产生的 //依赖就近 as lazy as possible

逗乐:AMD没有明显的BUG,但是CMD明显没有BUG

如何实现模块 (require.js)

requirejs本身就是一个js文件,这个文件实现了AMD规范,所以可以帮助我们在前端开发中实现模块化!

模块的定义

//如果当前模块没有任何依赖项
define(function(){ }); //如果一个模块要引用另外一个模块,就将模块的名称放在第一个参数的数组中
define(["模块","模块"], function(形参, 形参){ //模块和形参一一对应,形参就表示每个对应的模块的返回值
//可以通过当前函数的形参,接收其他模块的返回值!
//定义模块的时候,可以有返回值,也可以没有返回
//如果有返回值,就可以将返回值交给调用该模块的模块使用
})

模块的使用

require函数可以用来引用模块,require的第一个参数为数组,里面写所有要引用的模块的名称

//只引用模块,不执行其他代码
require([]); //引用模块,并且执行一些操作!
require([], function(){
//可以通过当前函数的形参,接收其他模块的返回值!
})

入口文件

在引用requirejs的script标签中,可以指定一个入口文件(data-main),当require.js文件加载完成之后,会自动执行,这个入口文件中的代码!

模块的路径

  1. 默认情况下,模块的路径是以调用模块的页面的目录为基础的!
  2. 当使用入口文件的时候,模块的路径是以入口文件的目录作为基础的
  3. 如果使用了require.config配置了baseUrl,就一配置的baseUrl为基础查找文件

自定义模块路径查找

require.config({
baseUrl: "/"
});

使用require 加载传统的js

例如加载bootstrap, 因为bootstrap是基于jQuery,所以要手动的设置依赖项

在require.config({

//在shim属性中,通过deps属性,为bootstrap添加依赖项

shim: {

	bootstrap:{
deps: []
}
}

})

jquery支持模块化,jquery.cookie也支持模块化!

使用requirejs加载非模块化的内容

如果加载的非模块化的内容有依赖项,就要在config中,在shim属性中,通过deps属性,为这个非模块化的内容添加依赖项

如果加载的非模块化的内容要返回内容给我们使用,就要在config中,在shim属性中,通过exports属性,来设置返回的内容,这个内容可以是非模块化的文件中任意一个变量名(字符串)

匿名模块 和 具名模块

//匿名模块的定义
define([], function(){ }) //具名模块的定义
define("模块名", [], function(){ }) //具名模块中的模块名,必须和paths中设置的路径的名称一致,才能够访问,不然会出现路径错误
graph LR
A-->B
graph LR
A-->B
sequenceDiagram
A->>B: How are you?
B->>A: Great!
gantt
dateFormat YYYY-MM-DD
section S1
T1: 2014-01-01, 9d
section S2
T2: 2014-01-11, 9d
section S3
T3: 2014-01-02, 9d
gantt
dateFormat YYYY-MM-DD
section S1
T1: 2014-01-01, 9d
section S2
T2: 2014-01-11, 9d
section S3
T3: 2014-01-02, 9d

模块化开发(requireJS)的更多相关文章

  1. 模块化开发RequireJS之shim配置

    一.shim requirejs使用AMD规范开发,若开发过程中加载非AMD规范js,需要使用requirejs的shim进行配置. shim配置语法为: //配置文件 requirejs.confi ...

  2. 模块化开发RequireJS之路径解析

    1.requirejs遵循AMD规范,将需要的都加载好(前置加载).注:cmd是就近加载. define(['jQuery','dialog'],function($,d){ // 业务逻辑 }) ( ...

  3. Angular 结合RequireJs实现模块化开发

    angular的指令是模块化很好的一个体现,下面我将只使用指令(不用控制器),结合requirejs,实现模块化开发. 模块化关系图:

  4. Javascript模块化开发,使用模块化脚本加载工具RequireJS,提高你代码的速度和质量。

    随着前端JavaScript代码越来越重,如何组织JavaScript代码变得非常重要,好的组织方式,可以让别人和自己很好的理解代码,也便于维护和测试.模块化是一种非常好的代码组织方式,本文试着对Ja ...

  5. 在Html中使用Requirejs进行模块化开发

    在前端模块化的时候,不仅仅是js需要进行模块化管理,html有时候也需要模块化管理.这里就介绍下如何通过requirejs,实现html代码的模块化开发. 如何使用requirejs加载html Re ...

  6. [工具配置]使用requirejs模块化开发多页面一个入口js的使用方式

    描述 知道requirejs的都知道,每一个页面需要进行模块化开发都得有一个入口js文件进行模块配置.但是现在就有一个很尴尬的问题,如果页面很多的话,那么这个data-main对应的入口文件就会很多. ...

  7. 【模块化开发】------requireJS的基本使用------【巷子】

    前言 为了提高代码的复用度,开发人员会按照功能把大量的js代码分成若干文件,这样在多个页面就可以使用同一个文件了.,下面是某个网站的js引用情况 虽然代码的复用度提升了,但是缺点也体现了出来 缺点: ...

  8. 使用requirejs模块化开发多页面一个入口js的使用方式

    描述 知道requirejs的都知道,每一个页面需要进行模块化开发都得有一个入口js文件进行模块配置.但是现在就有一个很尴尬的问题,如果页面很多的话,那么这个data-main对应的入口文件就会很多. ...

  9. JS模块化开发:使用SeaJs高效构建页面

    一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...

随机推荐

  1. centos 7 中安装Oracle 12c

    今天有需要在centos 7上安装oracle 12 所以上网查了一下安装流程,原贴转自:https://blog.csdn.net/github_39294367/article/details/7 ...

  2. SQL Server中配置ODBC数据源

    单击“开始→windows系统→控制面板”,打开控制面板 单击“管理工具→ODBC数据源(32位)”打开ODBC数据源配置对话框 在数据源配置对话框中单击“系统DSN”选项卡下的“添加”按钮,创建数据 ...

  3. Java中JNI的使用详解第五篇:C/C++中操作Java中的数组

    在Java中数组分为两种: 1.基本类型数组 2.对象类型(Object[])的数组(数组中存放的是指向Java对象中的引用) 一个能通用于两种不同类型数组的函数: GetArrayLength(ja ...

  4. Python 空值和非空值

    1)任何值为0的值都是false,任何非0的值都是true if -0.0: print 'yes' #不打印yes if -0.1: print 'yes' #打印yes 2)任何为空的值都是fla ...

  5. Python内置的一个用于命令项选项与参数解析的模块argparse

    一.argparse简单使用 我们先来看一个简单示例.主要有三个步骤: 创建 ArgumentParser() 对象 调用 add_argument() 方法添加参数 使用 parse_args() ...

  6. C++从string中删除所有的某个特定字符【转载】

    转载自https://www.cnblogs.com/7z7chn/p/6341453.html C++中要从string中删除所有某个特定字符, 可用如下代码 str.erase(std::remo ...

  7. CocoaPods管理iOS项目 2018年11月06日

    一.创建Test工程项目 二.打开终端 当前pod版本(1.6.0.beta.2最新版本2018年11月06日)和gem源路径(https://gems.ruby-china.com): 1.cd+当 ...

  8. PAT_A1004#Counting Leaves

    Source: PAT A1004 Counting Leaves (30 分) Description: A family hierarchy is usually presented by a p ...

  9. Codeforces 1166B - All the Vowels Please

    题目链接:http://codeforces.com/problemset/problem/1166/B 个元音. 思路:先判断能否弄出至少5*5的行列,然后按顺序填字符串就好了. AC代码: #in ...

  10. 剑指offer——09青蛙跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果).   题解: 说俗一点,就是找规律: 不不,首先,我们分析一下,青蛙第一 ...