typescript_nodejs:commonjs和ES Module规范对比和导入导出代码实践.md

1 背景

之前一直使用typescript,没怎么接触过用于模块、文件导入的require函数,最近在用油猴写一个的脚本,有一个十分迫切的需求:油猴脚本中所有的js文件都写在一个函数中,typescript如果引入其他模块,要么使用“<script src=“https://cdn.bootcss.com/xlsx/0.15.1/cpexcel.js”></script>”这样的方式从网络中读取脚本,要么在本地使用“tsc --out main.js main.ts”的方式将所有用到的代码编译进一个js文件,但是要想编译进一个文件,则必须实用AMD(异步加载依赖)的方式,想要异步加载依赖又要使用require函数,不仅就有疑问:
commonjs也是用的rquire,require究竟是干什么的?commonjs、exModule、AMD这些模块引擎有什么区别?ts项目使用不同的模块引擎时,该怎样导入导出模块?

2 commonjs、esModule和AMD、CMDS的区别和联系

在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可;如今CPU、浏览器性能得到了极大的提升,很多页面逻辑迁移到了客户端(表单验证等),随着web2.0时代的到来,Ajax技术得到广泛应用,jQuery等前端库层出不穷,前端代码日益膨胀,这时候JavaScript作为嵌入式的脚本语言的定位动摇了,JavaScript却没有为组织代码提供任何明显帮助,甚至没有类的概念,更不用说模块(module)了,JavaScript极其简单的代码组织规范不足以驾驭如此庞大规模的代码。

2.1 模块的由来

既然JavaScript不能handle如此大规模的代码,我们可以借鉴一下其它语言是怎么处理大规模程序设计的,在Java中有一个重要带概念——package,逻辑上相关的代码组织到同一个包内,包内是一个相对独立的王国,不用担心命名冲突什么的,那么外部如果使用呢?直接import对应的package即可,比如:

import java.util.ArrayList; 

遗憾的是JavaScript在设计时定位原因,没有提供类似的功能,开发者需要模拟出类似的功能,来隔离、组织复杂的JavaScript代码,称为模块化。一个模块就是实现特定功能的文件,有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。模块开发需要遵循一定的规范,各行其是就都乱套了,规范形成的过程是痛苦的,可以把所有的模块成员封装在一个对象中

var myModule = {
   
    var1: 1,

    var2: 2,

    fn1: function(){
   

    },

    fn2: function(){
   

    }
}

这样我们在希望调用模块的时候引用对应文件,然后,myModule.fn2(); 这样避免了变量污染,只要保证模块名唯一即可,同时同一模块内的成员也有了关系,看似不错的解决方案,但是也有缺陷,外部可以随意修改内部成员,比如:myModel.var1 = 100; 这样就会产生意外的安全问题,我偷偷修改内部的变量/对象,会让同一进程中的调用跟着出错,因此出现了:

立即执行函数,可以通过立即执行函数,来达到隐藏细节的目的:

var
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值