之前学习过webpack3的知识,但是webpack4升级后还是有很多变动的,所以这次重新整理一下webpack4的知识点,方便以后复习。

这次学习webpack4不仅仅要会配置,记住核心API,最好还要理解一下webpack更深层次的知识,比如打包原理等等,所以可能会省略一些比较基础的内容,但是希望我可以通过此次学习掌握webpack,更好地应对以后的工作。

这一节会深入理解webpack原理

1.模块分析

我们这一次会实现一个类似webpack的工具,首先来写模块分析部分。

代码地址:

代码仓库

先把目录搭好,src下有三个js文件,每个文件里面对应以下内容:

word.js

message.js

index.js

现在这个代码在浏览器中是没有办法运行的,需要借助类似webpack这种工具才可以,所以我们需要借助node.js实现一个打包工具。

和src同级,我们新建一个bundler.js。

创建一个函数,用来分析打包入口文件,支持传入一个参数(文件路径),然后利用node读取文件内容。

而index中引用了message.js,我们需要把引用的文件名提取出来,要借助@babel/parser分析我们的源代码。

cnpm install @babel/parser --save
复制代码

@babel/parser提供了一个parse方法,第一个参数传入文件内容,第二个参数传一个对象。

方法返回的对象是一个抽象语法树(AST)。

对象里面有一个program.body,内容是这样的:

第一个Node的type是ImportDeclaration,意思是引入声明语句,我们index.js中第一行确实是引入语句。第二个Node的type是ExpressionStatement,意思是表达式语句,我们第二行写的console.log(),确实是表达式语句。所以借助这个工具,我们就可以分析文件之间的依赖关系。

为了找出所有的依赖关系,我们要遍历所有type是ImportDeclaration的语句,自己写会比较麻烦,还可以借助@babel/traverse

cnpm install --save @babel/traverse
复制代码

traverse是一个函数,第一个参数接受抽象语法树,第二个参数是一个对象。

抽象语法树中有元素的type是ImportDeclaration时,就会执行ImportDeclaration函数,它接受的参数可以解构出一个node,它就是所有type是ImportDeclaration的元素,就是我们所有的依赖,里面哟一个source,value值就是文件名,所以我们就可以把所有文件名都存起来

声明一个数组,把所有node中的soure.value都push到数组中。

这样入口分析就已经分析好了,但是这时候分析的依赖都是相对路径,我们要把它改为绝对路径,或者是相对于根路径的相对路径,这样才不会有问题,所以要借助node中的path。

但是我们为了方便以后开发,现在应该把绝对路径和相对路径都存好,所以把原先的数组变成对象,用以下方法存起来。

对象的key是相对路径,value是绝对路径。

然后就返回入口文件名,和文件所有依赖的内容。

但是我们用的ES Module引入文件,浏览器无法识别这个语法,就要依赖@babel/core。

cnpm install --save @babel/core
复制代码

@babel/core提供了一个方法,transformFromAst,可以把抽象语法树转化成浏览器可以运行的代码。

传入的参数中还可以配置ES6转ES5的插件,所以要先安装一下@babel/preset-env。

cnpm install --save @babel/preset-env
复制代码

函数会返回一个对象,里面有一个code属性,code属性中就是我们浏览器可以运行的代码。

最后返回我们分析的结果。

返回的结果意思是:入口文件是index.js;引用的依赖是message.js,地址是src/message.js;浏览器中可以运行的代码是code中的内容。

2.依赖图谱

我们现在只分析了入口文件的依赖,接下来我们要开始分析其他依赖,从message开始,一层一层把所有依赖都分析完。

我们再创建一个函数,用来制作依赖图谱,利用类似递归的方式,调用moduleAnalyser逐层分析依赖内容,并把它们都放到一个数组中。

最后生成的数组。

然后我们把它整合成一个对象,用路径作为key,依赖和代码作为value,并且返回这个对象。

对象的内容。

3.生成代码

拿到依赖图谱,现在要开始生成浏览器可以运行的代码了。

先看生成的代码中,存在require和exports两个方法,但是浏览器中没有这两个方法,所以我们要先定义这两个方法,然后把生成的代码片段利用闭包的形式执行。

require函数中,通过传入路径拿到对应的代码,利用eval()执行,如果require中有依赖,继续执行require时拿到的就是相对路径,需要转成绝对路径,直接去我们之前创建的对象中取就可以。

exports是一个空对象即可,这样导出的内容会被存到exports中。

然后把生成的代码格式化一下,复制到浏览器中执行。

就打印出say hello了。

这样,我们就已经实现了一个简易的webpack打包工具了,具体代码可以去我的github仓库里面看。

参考

从基础到实战 手把手带你掌握新版Webpack4.0 ----DellLee

转载于:https://juejin.im/post/5d00fbbb5188255e780b64b1

复习webpack4之实现简易的webpack相关推荐

  1. 复习webpack4之Code Splitting

    之前学习过webpack3的知识,但是webpack4升级后还是有很多变动的,所以这次重新整理一下webpack4的知识点,方便以后复习. 这次学习webpack4不仅仅要会配置,记住核心API,最好 ...

  2. css练习题4,复习webpack4之CSS文件代码分割

    之前学习过webpack3的知识,但是webpack4升级后还是有很多变动的,所以这次重新整理一下webpack4的知识点,方便以后复习. 这次学习webpack4不仅仅要会配置,记住核心API,最好 ...

  3. Webpack4 学习笔记 - 01:webpack的安装和简单配置

    安装 webpack 新建一个Demo文件夹,执行初始化: npm init 在Demo文件夹里安装 webpack 和 webpack-cli : npm install webpack webpa ...

  4. 手把手教你撸一个简易的 webpack

    背景 随着前端复杂度的不断提升,诞生出很多打包工具,比如最先的grunt,gulp.到后来的webpack和Parcel.但是目前很多脚手架工具,比如vue-cli已经帮我们集成了一些构建工具的使用. ...

  5. 一个简易的webpack开发环境

    本菜鸟搭建的入门级别的webpack环境, 仅供参考,webpack学精很不容易,每个插件作者都有自己的思想. 待我吃透了再说. 待我后续完善, 目前可以 提取图片 服务器环境 支持跨域 热更新 ES ...

  6. JavaScript复习使用定时器的简易式诸葛大力轮播图

    先上效果图 很简单的代码 先创建个文件夹保存成果的照片,然后通过更改src来用定时器循环这些照片 <!DOCTYPE html> <html lang="zh-CN&quo ...

  7. Webpack4 学习笔记一初探Webpack

    前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 Webpack 打包文件 支持JS模块化 模式: production(0配置默认), development(生产环境) 更详细的 ...

  8. 2020年前端面试复习必读精选文章【赠复习导图】

    前言 之前写过一篇 一年半经验如何准备阿里巴巴前端面试,给大家分享了一个面试复习导图,有很多朋友说希望能够针对每个 case 提供一个参考答案. 写答案就算了,一是精力有限,二是我觉得大家还是需要自己 ...

  9. github大佬呕心沥血整理的2020年前端面试复习必读精选文章【赠复习导图】

    2021年前端面试必读文章[超三百篇文章/赠复习导图] 转载.原文链接 哈哈,之前是 2020 年必读文章,到了 2021 年了,感觉这些文章还都是经典,那就改个标题吧.[手动狗头] 前言 之前写过一 ...

最新文章

  1. zendopcache代替APC效果不错
  2. shell 练习题01:列出使用最多的命令是哪些并且将这些命令输入到chy1.txt中
  3. SciPy和Numpy处理能力
  4. 逻辑斯蒂回归_逻辑斯蒂回归详细解析 | 统计学习方法学习笔记 | 数据分析 | 机器学习...
  5. c+gui语言可视化编程
  6. mqtt如何判断设备离线_污水处理设备公司给出的价格如何判断真实性?
  7. Android性能测试-内存
  8. 桌面 NAS 是什么
  9. MongoDB 宣布已收购数据库托管公司 mLab
  10. linux kill
  11. 陆振波的svm的matlab代码的解释,陆振波SVM的MATLAB代码解释
  12. 软件测试实战(微软技术专家经验总结)--第四章(测试建模)读书笔记
  13. 2018年宇视科技智能交通-嵌入式软件开发线上笔试题
  14. opengl arm linux,开源头条 | ARM v9架构发布
  15. mybatis中设置主键返回
  16. [work] Ubuntu 常用快捷键总结
  17. 如何设置table的单元格间距?
  18. 使用.Net分析.Net达人挑战赛参与情况
  19. 【软件设计师中级】设计模式之抽象工厂学习笔记(c++)
  20. 二、Hadoop完全分布部署

热门文章

  1. ArcGIS Engine开发前基础知识(4)
  2. GitHub Top 100 Objective-C 项目简介
  3. MagicalRecord使用中的注意事项
  4. 分页数据的新展示方式---瀑布流
  5. Lombok 安装、入门 - 消除冗长的 java 代码
  6. linux(1)- 简单的 shell 解释器
  7. nginx负载均衡高可用
  8. JQuery Basic Features Quick Walkthrough
  9. 基于PyTorch的GAN框架TorchGAN:用架构级API轻松定制GAN项目
  10. iOS中的UIView