一文搞懂JS模块、模块格式、模块加载器和模块打包器(上)

简介: 接下来我们就来一起学习下js模块、模块化解决方案、模块加载器和模块打包器的区别。本文的主要意图是帮大家快速理解现代前端JS开发的概念,并不会深入去探讨每种工具和模式。

目前现代化的JS开发方式大行其道。撸代码时,你可能也会不理解为啥要使用这些繁复的现代化工具。


接下来我们就来一起学习下js模块、模块化解决方案、模块加载器和模块打包器的区别。


本文的主要意图是帮大家快速理解现代前端JS开发的概念,并不会深入去探讨每种工具和模式。


什么是模块?


模块是一块可复用的代码。它封装了实现细节,对外提供公开的API以便其他代码可以轻松加载和使用。


为啥要使用模块?


从技术应用的角度来说,模块并不是必须的。


模块化是一种代码组织方式。开发者们从六七十年代开始在各种编程语言中以多种形式使用了。


在JS中,模块化理想情况下应该允许我们:


  • 抽象代码:将功能实现抽离到特定的库,使用者无需去关注复杂的内部实现逻辑。


  • 封装代码:如果不希望代码被修改,则将代码隐藏在模块中。


  • 复用代码:以避免重复写相同的代码。


  • 管理依赖:轻松改变依赖而无需重写我们的代码。


ES5中的模块模式


ES5及更早之前的版本,在设计时并没有考虑到模块机制。随着时间的推移,开发者想出了多种方式在JS中模拟实现模块机制。


这里我们介绍2个简单的实现方式。


Immediately Invoked Function Expression(IIFE)


(function(){
    // ...dosomething
})()


IIFE本质上定义一个立即执行的匿名函数。


要注意的是匿名函数是被括号围起来的,在JS中,如果代码行是以关键字function开始,表示声明一个函数。


// 函数声明
function(){
    console.log('test');
}


直接调用函数声明会报错:


// 直接调用函数声明
function(){
    console.log('test');
}()
// => Uncaught SyntaxError: Unexpected token )


通过给函数加上圆括号,使其成为一个函数表达式:


// 函数表达式
(function() {
  console.log("test");
});
// => 返回 function(){ console.log('test') }


函数表达式返回一个函数,因此我们可以直接调用它:


// IIFE:立即执行函数表达式
(function() {
  console.log("test");
})();
// => console中打印字符串 'test'


IIFE 带来的好处:


  • 将代码的复杂性封装到 IIFE 中,我们无需关注其实现。


  • IIFE 中定义变量,避免对全局作用域造成污染。


不过,IIFE 没有提供依赖管理机制。


Revealing Module partten


Revealing Module parttenIIFE 类似,不同之处是它把IIFE的返回值赋给一个变量。


// 将模块导出为一个全局变量
var singleton = (function() {
  // 内部逻辑
  function sayHello() {
    console.log("Hello");
  }
  // 对外暴露的 API
  return {
    sayHello: sayHello,
  };
})();


这里我们没有把匿名函数放在括号内,因为function关键字没有在行首。


// 访问模块的方法
singleton.sayHello();
// => Hello


除了导出单例对象,模块还可以导出一个构造函数:


// 将模块暴露为全局变量
var Module = function() {
  // 内部逻辑
  function sayHello() {
    console.log("Hello");
  }
  // 导出 API
  return {
    sayHello: sayHello,
  };
};


注意,我们没有在声明时立即执行函数。

相关文章
|
1月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
534 1
|
2月前
|
缓存 JavaScript 前端开发
高效打造跨平台桌面应用:Electron加载服务器端JS
【9月更文挑战第17天】Electron 是一个基于 Chromium 和 Node.js 的开源框架,允许使用 HTML、CSS 和 JavaScript 构建跨平台桌面应用。加载服务器端 JS 可增强应用灵活性,实现代码复用、动态更新及实时通信。通过 HTTP 请求、WebSocket 或文件系统可实现加载,但需注意安全性、性能和兼容性问题。开发者应根据需求选择合适方法并谨慎实施。
125 3
|
3月前
|
消息中间件 JavaScript 中间件
函数计算产品使用问题之WebIDE编写的Node.js代码是否会自动进行打包部署
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5天前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
Next.js和Nuxt.js在优化CSS和JavaScript加载方面提供了多种策略和工具。Next.js通过代码拆分、图片优化和特定的CSS/JavaScript优化措施提升性能;Nuxt.js则通过代码分割、懒加载、预渲染静态页面、Webpack配置和服务端缓存来实现优化。两者均能有效提高应用性能。
|
1月前
|
JavaScript 中间件 Shell
Node.js JXcore 打包
10月更文挑战第8天
33 1
|
1月前
|
缓存 JSON JavaScript
Node.js模块系统
10月更文挑战第4天
37 2
|
1月前
|
前端开发 JavaScript 开发者
深入了解Webpack:现代JavaScript应用的打包利器
【10月更文挑战第11天】 深入了解Webpack:现代JavaScript应用的打包利器
|
2月前
|
XML JSON JavaScript
js的json格式
js的json格式
|
1月前
|
JavaScript 应用服务中间件 Apache
Node.js Web 模块
10月更文挑战第7天
30 0
|
1月前
|
JavaScript 网络协议
Node.js 工具模块
10月更文挑战第7天
20 0