Web前端-JS-01-JS模块化规范

没有规矩,不成方圆,今天我们就来聊聊模块化规范

tmpdir__17_9_7_15_04_07.jpg

模块:对一些复杂的代码功能进行分离、按照某个规范进行封装成单个或者多个文件,同时暴露一些属性或者方法给外界调用。

为什么要模块化?
1.避免变量污染或者冲突
2.便于代码封装,提高复用性
3.代码便于维护,逻辑分离

温馨提示:文章结构如下,阅读完可能需要花费3分钟

一、模块化的进化过程
二、模块化规范之-CommonJS规范
三、模块化规范之-AMD规范
四、模块化规范之-CMD规范
五、模块化规范之-ES6规范

进入正文

一、模块化的进化过程

1.全局function模式 : 将不同的功能封装成不同的全局函数

优点:把单一功能封装在函数中,增加复用性
缺点:命名空间被污染,数据不安全,容易命名冲突

使用案例:

 function funcA() {
   console.log('函数A')
 }
function funcB() {
    console.log('函数B')
}
2.namespace模式: 命名空间,封装成对象

优点:减少全局变量
缺点: 数据不安全,可以直接修改内部变量

使用案例:

const module = {
message: "我是一个message",
run(){
       console.log('开始运行', this.message);
  },
};
module.message = "test";
module.run();
3.IIFE模式: 立即执行函数

优点:私有数据,外部只能访问暴露的方法或者属性
缺点:模块依赖其他模块比较麻烦

使用案例:

(function (window) {
    const url = "www.baidu.com";
    function run(){
        console.log('开始运行', this.url);
    };
    window.myModule = {run, url};
})(window);
myModule.run();

二、模块化规范之-CommonJS规范

同步加载,服务端文件一般存在本地,所以使用同步加载比较快,这个规范服务端常用

  1. CommonJS说明
    1.1.每个文件就是一个模块,有自己的作用域;
    1.2 每个文件里面定义的变量、函数、类,都是私有的;
    1.3.服务端-模块的加载是运行时同步加载;
    1.4.浏览器端-模块需要提前编译打包处理,才可以被运行
    1.5 运行时确定依赖关系
    1.6 CommonJS 模块输出的是一个值的拷贝

  2. 基本语法

导出方式一 : module.exports.xxxx = value

   const url = "www.zb.com";
   function funcA() {
      console.log('commonjs-导出-模块A',url);
   }
   //暴露属性
   module.exports.test = url;
   // 暴露方法
   module.exports.funcB = funcA;

导出方式二 : module.exports = {}

module.exports = {
   count: 4,
   addCount(){
        this.count++;
   },
   printB(){
        console.log('打印模块B');
   }
}

导入引用: require('路径引入或者第三方模块')

浏览器不能直接使用require,需要使用webpack 或者browserify 编译之后的文件浏览器才能识别

本质:加载某个模块,其实是加载该模块的module.exports属性

 const moduleA = require('./moduleA.js');
 const moduleB = require('./moduleB.js');
 console.log('打印模块A的属性',moduleA.test);
 moduleA.funcB();
 moduleB.printB();
 console.log('模块计算前的值',moduleB.count);
 moduleB.addCount();
 console.log('模块计算后的值',moduleB.count);

3.使用工具
browserify 或者 weback

三、模块化规范之-AMD规范

非同步加载,主要用于浏览器端

  1. AMD规范说明
    1.1 主要用于浏览器端,模块加载是异步的
    1.2 依赖于require.js

  2. 基本语法
    导出方式一 : 无依赖直接导出模块

    define(function () {
       const moduleA = {
        getMessage: function () {
         return "我是模块A的message";
      }
    }
       return moduleA;
    });
    

导出方式二 :有依赖导出

  define(['moduleA'], function (moduleA) {
  const moduleB = {
      getReuslt: function () {
          return moduleA.getMessage() + "我是模块B";
      },
  };
  return moduleB;
 });

引用模块

require(['moduleA','moduleB'], function (moduleA , moduleB) {
    moduleB.getReuslt();
})
  1. AMD + requirejs 使用

第一步: 下载require.js

下载方式 : 官网下载 或者 npm install requirejs --save-dev

第二步: 创建自定义模块, 目录如下moduleA, moduleB

image.png

第三步: 创建main.js 作为自定义模块的入口并配置

 // main.js
 (function () {
require.config({
    baseUrl: "./05-模块化规范/053-AMD规范",
    paths:{
        //映射: 模块标识名: 路径 不能加js
        moduleA: './moduleA', 
        moduleB: './moduleB'
    }
});
require('moduleB', function (moduleB) {
    moduleB.getReuslt();
})
})();

第四步:html中引用main.js 与requirejs

 <script src="../node_modules/requirejs/require.js" defer async="true"data-main="./053-AMD规范/main.js"></script>

defer async 表示异步 兼容写法
src: 引用requirejs
data-main: 模块入口

三、模块化规范之-CMD规范

  1. CMD规范说明
    1.1 commonjs + AMD 组合版
    1.2 主要用于浏览器
    1.3 模块的加载是异步的
    1.4 依赖于sea.js

  2. 基本语法

导出方式一:导出没有依赖的模块

define(function (require, exports, module) {
const moduleAA = {
    message: "我是模块AA",
};
module.exports = moduleAA;
});

导出方式二:导出有依赖的模块

define(function (require, exports, module) {
   const moduleAA = require('./moduleAA');
   const moduleBB = {
        printMessage:function () {
          console.log("我是模块BB" + moduleAA.message);
      },
};
  module.exports = moduleBB;
});

引入导入方式:define(function (require) {})

 define(function (require) {
const moduleBB = require('./moduleBB');
const moduleAA = require('./moduleAA');
// console.log('main文件打印---',moduleAA.message);
console.log('main文件打印---',moduleBB.printMessage());
});
  1. CMD+sea.js

第一步:下载或安装seajs npm install seajs --save-dev

第二步:新建自定义模块, 目录结构如下

image.png

第三步:新增main.js作为模块入口

// main.js
 define(function (require) {
const moduleBB = require('./moduleBB');
const moduleAA = require('./moduleAA');
// console.log('main文件打印---',moduleAA.message);
console.log('main文件打印---',moduleBB.printMessage());
});

第四步:html 使用模块

 <script  src="../node_modules/seajs/dist/sea.js"></script>
 <script type="text/javascript">
     seajs.use('./054-CMD规范/main');
 </script>

五、模块化规范之- ES6规范- 常用

  1. ES6规范说明
    1.1 编译时确定依赖关系
    1.2 ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块
    1.3 ES6 模块输出的是值的引用值

  2. 基本语法

导出

export default xxx 或者 export {}

导入

import

  1. 语法编译工具
    A. 使用Babel将ES6编译为ES5代码;
    B. 使用Browserify编译打包js
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268