文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Webpack原理与实践之Webpack究竟解决了什么问题?

2024-12-02 13:01

关注

写在前面

Webpack所解决的问题是:如何在前端项目中更高效地管理和维护项目中的每个资源。想要搞明白webpack,就必须先对它想要解决的问题或目标有个充分的认识。

模块化的演化进程

阶段1:文件划分方式

  1. |--01-files 
  2.   |--module-01.js 
  3.   |--module-02.js 
  4.   |--index.html 
  1. -- index.html --> 
  2.  
  3. "en"
  4.  
  5.   "UTF-8"
  6.   "X-UA-Compatible" content="IE=edge"
  7.   name="viewport" content="width=device-width, initial-scale=1.0"
  8.   Document 
  9.  
  10.  
  11.   "./module-01.js"
  12.   "./module-02.js"
  13.    
  14.  
  15.  
  1. //module-01.js 
  2. function fun(){ 
  3.   console.log("module-01-fun"); 
  1. //module-02.js 
  2. var data = "yichuan"

在这种进行文件划分方式中,缺点有:

当然,当你项目代码少的时候可能感受不到这种方式的缺点,但是当你代码变大的时候,这种划分方式造成的问题会暴露地淋漓尽致。

阶段2:命名空间方式

在命名空间方式中,解决命名冲突的问题外,其它问题依旧存在

  1. "./module-01.js"
  2.   "./module-02.js"
  3.    
  1. // module-01.js 
  2.  
  3. window.module01 = { 
  4.   fun:function(){ 
  5.     console.log("module-01-fun"); 
  6.   } 
  7.  
  8. // module-02.js 
  9. window.module02 = { 
  10.   data:"yichuan"
  11.   fun:function(){ 
  12.     console.log("module-02-fun"
  13.   } 

阶段3:立即执行函数 IIFE

通过在文件中使用立即函数和闭包的方式,可以有效解决前面的全局作用污染的问题,而且可以通过参数明显表明这个模块的依赖。虽然解决了全局作用域污染问题,但是不能够通过代码控制模块的加载顺序的问题,不便于对模块的管理,因为你不知道什么模块没有被导入,什么模块被移除。

  1. "./module-01.js"
  2. "./module-02.js"
  3.  
  1. // module-01.js 
  2. ;(function(){ 
  3.   var name = "module-01"
  4.   function fun(){ 
  5.     console.log(name+"-fun"); 
  6.   } 
  7.   window.module01 = { 
  8.     fun:fun 
  9.   } 
  10.  
  11. })() 
  12.  
  13. // module-01.js 
  14. ;(function(){ 
  15.   var name = "module-02"
  16.   function fun(){ 
  17.     console.log(name+"-fun"); 
  18.   } 
  19.   window.module02 = { 
  20.     fun:fun 
  21.   } 
  22.  
  23. })() 

模块化规范的出现

当前是通过约定规则实现模块化的方式,不同的开发者在实施过程中会出现一些差别。

模块化规范的两点标准:

CommonJS规范

CommonJS规范是Node.js中所遵循的模块规范,该规范约定一个文件就是一个模块,每个模块都有单独的作用域,通过module.exports到处成员,再通过require函数进行导入模块。

AMD规范

虽然CommonJS规范使用也很方便,但是早期指定前端标准化模块时,并没有直接选择CommonJS规范,而是专门为浏览器短重新设计了AMD规范,也就是异步模块定义规范。

同期推出了Require.js,除了实现AMD模块化规范,本身也是一个非常强大的模块加载器。

  1. //AMD规范定义了一个模块 
  2. //module01.js 
  3. define(["./module02.js"],function(){ 
  4.   return
  5.     fun:function(){ 
  6.       console.log("hello-module-02"); 
  7.     } 
  8.   } 
  9. }) 
  10.  
  11. //AMD规范载入了一个模块 
  12. //module02.js 
  13. require(["./module01.js"],function(module01){ 
  14.   module01.fun(); 
  15. }) 

在Javascript的标准逐渐走向完善,端模块化规范的最佳实践方式也基本得到了统一:

ES Modules规范是ES2015中才定义的模块化系统,是最近几年才制定的标准,存在环境兼容性问题,随着webpack等一系列打包工具的流行,此规范才逐渐开始被普及。经过几年的迭代,ES Modules规范已经成为现今最主流的前端模块化标准。

  1. //module01.js 
  2. export default function fun(){ 
  3.   console.log("hello-module01"); 
  4.  
  5. //module02.js 
  6. import fun from "./module01.js"
  7. fun() 

模块打包工具的出现

随着日益复杂的项目开发,在前端应用开发过程中不仅只有JS代码需要模块化,HTML和CSS这些资源文件也会面临需要被模块化的问题。从宏观角度看,这些文件也都应该被看做前端应用的一个模块,只不过这些模块的种类和用途和JS不同。

我们知道ES Modules近些年才制定的模块化标准,因此在当前浏览器环境可存在兼容问题,因此需要经过模块打包工具将ES6代码转为ES5代码。

参考文章

《Webpack官方文档》

《webpack原理与实践》

写在最后

前端模块化的发展过程和最终统一的ES Modules标准使我们深入了解webpack必须掌握的基础内容,也是现代前端开发者必不可少的基础知识。

 

来源:前端万有引力内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯