详解Js模块化的作用原理和方案


Posted in Javascript onApril 29, 2021

一、模块化概念

将一个复杂的程序依据一定的规则(规范)封装成几个块(文件), 并进行组合在一起;块的内部数据与实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信。

二、模块化作用

为什么要用模块化的JavaScript?

因为在实际的开发过程中,经常会遇到变量、函数、对象等名字的冲突,这样就容易造成冲突,还会造成全局变量被污染;
同时,程序复杂时需要写很多代码,而且还要引入很多类库,这样稍微不注意就容易造成文件依赖混乱;
为了解决上面的的问题,我们才开始使用模块化的js,所以说模块化的作用就是:

  • 避免全局变量被污染
  • 便于代码编写和维护

三、模块化历程

1、普通写法(全局函数及变量)

其实只要是不同的函数或变量放一起就是简单的模块,这样弊端很明显,就是变量容易被污染;

var name = '卡卡';
function cat1(){
    name = '年年';
}
function cat2(){
    name = '有鱼';
}

2、对象封装

将整个模块放在一个对象里面,外部访问时直接调用对象的属性或者方法就行

var cat = {
    name:'卡卡',
    cat1:function(){
        var name = '年年';
        console.log(name);
    },
    cat2:function(){
        var name = '有鱼';
        console.log(name);
    }
}
cat.name;// 卡卡
cat.cat1();// 年年
cat.cat2();// 有鱼

这种方法虽然解决了变量冲突问题,但是容易被外部随意修改:

cat.name = '楼楼';

3、匿名函数方式

var cat = (function () {
    // 匿名函数的局部变量name
    var name = '卡卡';
    // 匿名函数的局部函数cat1
    var cat1 = function () {
        var name = '年年';
        console.log(name);
    };
    // 匿名函数的局部函数cat2
    var cat2 = function () {
        var name = '有鱼';
        console.log(name);
    };
    //通过window暴露一个对外的口,想要被外界访问,可以放到这里
    window.myModule = {
        cat1:cat1,
        cat2:cat2,
        name:name,
    };
})();
console.log(myModule.name);// name变量放入暴露口内,可以输出,结果为:卡卡
myModule.cat1();// cat1函数放入暴露口内,可以输出,结果为:年年
myModule.cat2();// cat2函数放入暴露口内,可以输出,结果为:有鱼

如果把变量name移除,此时再访问就访问不了,结果为undefined,这样就实现了变量不被随意修改的问题,即:

window.myModule = {
    cat1:cat1,
    cat2:cat2,
};
console.log(myModule.name);// undefined

匿名函数方式基本上解决了函数污染及变量随意被修改问题,这个也是模块化规范的基石!

详解Js模块化的作用原理和方案

四、模块化方案

根据匿名函数自调用的方式,同时为了增强代码依赖性,现在大部分JavaScript运行环境都有自己的模块化规范;

可以分为:Commonjs、AMD、CMD、ES6 module四大类

1、CommonJS

①在node环境下使用,不支持浏览器环境
②NodeJS遵循的规范
③使用require()进行引入依赖
④使用exports进行暴露模块

2、AMD

①浏览器环境下的异步加载模块
②RequireJS遵循的规范
③依赖于require.js模块管理工具库
④AMD 推崇依赖前置

3、CMD

①浏览器环境下,同时支持异步和同步加载
②SeaJS遵循的规范
③CMD 推崇依赖就近

4、ES6 module

ES6模块化语法在编译时就能确定模块的依赖关系,还能确定好输入输出的变量声明,已经不仅仅是模块规范,现在已经作为JS语言的标准语法使用,有以下特性:

①浏览器环境、服务器环境都支持
②编译时就能确定模块的依赖关系及变量,其他模块规范都是在运行时确定的
③export命令用于规定模块的对外接口
④import命令用于输入其他模块提供的功能

这里补充一点:ES5版本的模块化方案,仅在语言的层面上实现了模块化,缺点在于无法直接运行在大部分 JavaScript 运行环境下,必须通过构建工具转换成标准的 ES5 后才能正常运行,这里就需要使用自动化构建工具webpack。

以上就是详解Js模块化的作用原理和方案的详细内容,更多关于Js模块化的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
Prototype使用指南之ajax
Jan 10 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
Mar 28 Javascript
关于JavaScript中的关联数组分析
Apr 09 Javascript
选择器中含有空格在使用示例及注意事项
Jul 31 Javascript
jQueryUI中的datepicker使用方法详解
May 25 Javascript
深入浅析jQuery对象$.html
Aug 22 Javascript
js实现非常棒的弹出div
Oct 06 Javascript
干货!教大家如何选择Vue和React
Mar 13 Javascript
JavaScript实现的DOM绘制柱状图效果示例
Aug 08 Javascript
vue中v-show和v-if的异同及v-show用法
Jun 06 Javascript
详解iview的checkbox多选框全选时校验问题
Jun 10 Javascript
Javascript模拟实现new原理解析
Mar 03 Javascript
详解JavaScript中的执行上下文及调用堆栈
JavaScript实现淘宝商品图切换效果
JavaScript实现显示和隐藏图片
Apr 29 #Javascript
JS Canvas接口和动画效果大全
Apr 29 #Javascript
JS ES6异步解决方案
Apr 29 #Javascript
聊聊JS ES6中的解构
Apr 29 #Javascript
详解TypeScript中的类型保护
Apr 29 #Javascript
You might like
PHP实现分页的一个示例
2006/10/09 PHP
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
一贴学会PHP 新手入门教程
2009/08/03 PHP
PHP 事件机制(2)
2011/03/23 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
jQuery插件开发的两种方法及$.fn.extend的详解
2014/01/16 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
简单实现js拖拽效果
2017/07/25 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
javascript实现文件拖拽事件
2018/03/29 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python实现接受任意个数参数的函数方法
2018/04/21 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
Omio中国:全欧洲低价大巴、火车和航班搜索和比价
2018/08/09 全球购物
培训楼经理岗位责任制
2014/02/10 职场文书
《维生素c的故事》教学反思
2014/02/18 职场文书
合作协议书怎么写
2014/04/18 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
Redis主从复制操作和配置详情
2022/09/23 Redis