详解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 相关文章推荐
javascript下阻止表单重复提交、防刷新、防后退
Aug 17 Javascript
jQuery对html元素取值与赋值的方法
Nov 20 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
Apr 30 Javascript
jQuery使用deferreds串行多个ajax请求
Aug 22 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
Sep 05 Javascript
JavaScript 继承详解(五)
Oct 11 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
Dec 08 Javascript
JS中SetTimeout和SetInterval使用初探
Mar 23 Javascript
Express + Session 实现登录验证功能
Sep 08 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
Mar 15 Javascript
JS删除对象中某一属性案例详解
Sep 08 Javascript
Javascript实现关闭广告效果
Jan 29 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
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
laravel安装zend opcache加速器教程
2015/03/02 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
接收键盘指令的脚本
2006/06/26 Javascript
javascript操作文本框readOnly
2007/05/15 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
javascript正则表达式中的replace方法详解
2015/04/20 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
简述vue中的config配置
2018/01/23 Javascript
vue 利用路由守卫判断是否登录的方法
2018/09/29 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
Python IDLE入门简介
2017/12/08 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
python中的数据结构比较
2019/05/13 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
Pycharm调试程序技巧小结
2020/08/08 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
信息科学与技术专业求职信范文
2014/02/20 职场文书
电大毕业个人生自我鉴定
2014/03/26 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
离婚起诉书范本
2015/05/18 职场文书
付款证明模板
2015/06/19 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
浅析Python中的套接字编程
2021/06/22 Python