详解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 相关文章推荐
自制轻量级仿jQuery.boxy对话框插件代码
Oct 26 Javascript
JS比较两个时间大小的简单示例代码
Dec 20 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
Jun 10 Javascript
Canvas实现放射线动画效果
Feb 15 Javascript
Angular4表单验证代码详解
Sep 03 Javascript
vue bus全局事件中心简单Demo详解
Feb 26 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
Mar 08 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
May 04 Javascript
vuex与组件联合使用的方法
May 10 Javascript
从零开始用electron手撸一个截屏工具的示例代码
Oct 10 Javascript
ES6知识点整理之对象解构赋值应用示例
Apr 17 Javascript
Vue2.0 ES6语法降级ES5的操作
Oct 30 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调用Oracle存储过程
2006/10/09 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
php数组查找函数总结
2014/11/18 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
npm全局环境变量配置详解
2020/12/15 Javascript
python的urllib模块显示下载进度示例
2014/01/17 Python
Python3遍历目录树实现方法
2015/05/22 Python
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
Python中调用其他程序的方式详解
2019/08/06 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
JAVA招聘远程笔试题
2015/07/23 面试题
员工拾金不昧表扬信
2014/01/09 职场文书
上课不认真检讨书
2014/09/17 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
八一建军节慰问信
2015/02/14 职场文书
企业战略合作意向书
2015/05/08 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript