Webpack打包原理
打包原理
(1)读取入口文件,如项目中的main.js;
(2)由入口文件,解析模块所依赖的文件或包,生成ATS树;
(3)对模块代码进行处理:根据@babel工具转换ATS树(es6转es5、polyfill等);
(4)递归所有模块
(5)生成浏览器可运行的代码
打包优化
1.自带优化
a)tree-shaking:依赖关系解析(不用的不打包),只在production环境下执行
(1)读取入口文件,如项目中的main.js;
(2)由入口文件,解析模块所依赖的文件或包,生成ATS树;
(3)对模块代码进行处理:根据@babel工具转换ATS树(es6转es5、polyfill等);
(4)递归所有模块
(5)生成浏览器可运行的代码
1.自带优化
a)tree-shaking:依赖关系解析(不用的不打包),只在production环境下执行
使用plugin丰富的自定义API,可以控制webpack编译流程的每个环节,实现对webpack的自定义功能扩展。
plugin是一个具有 apply方法的 js对象。apply方法会被 webpack的 compiler(编译器)对象调用,并且 compiler 对象可在整个 compilation(编译)生命周期内访问。
1 | let CleanWebpackPlugin = require('clean-webpack-plugin'); |
loader: webpack本身只能打包Javascript文件,对于其他资源例如 css,图片,或者其他的语法集比如jsx,是没有办法加载的。 这就需要对应的loader将资源转化,加载进来。
样式
脚本转换编译
Files文件
加载框架
背景:一种类似于微服务的架构,它将微服务的理念应用于浏览器端,适用于巨石应用拆分为多个小型系统、多个单体应用整合等应用场景,并且各个前端应用可以独立运行、独立开发、独立部署。
主应用为基座,接入所有子应用
注册所有子应用
需要在入口暴露生命周期接口
require 是 AMD规范引入方式
import是es6的一个语法标准,如果要兼容浏览器的话必须转化成es5的语法
require是运行时调用,所以require理论上可以运用在代码的任何地方(虽然这么说但是还是一般放开头)
import是编译时调用,所以必须放在文件开头
require是赋值过程,其实require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量
import是解构过程,但是目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require
require / exports :
遵循 CommonJS/AMD,只能在运行时确定模块的依赖关系及输入/输出的变量,无法进行静态优化。
用法只有以下三种简单的写法:
1 | const fs = require('fs') |
import / export:
遵循 ES6 规范,支持编译时静态分析,便于JS引入宏和类型检验。动态绑定。
写法就比较多种多样:
每个文件就是一个模块,内部定义的变量是属于这个模块的,不会对外暴露,也就是不会污染全局变量。
node和webpack都对commonjs原生支持。
核心思想是通过require方法同步加载所依赖的其他模块,然后通过exports或者module.exports来导出需要暴露的接口.
浏览器不兼容CommonJs,原因是浏览器缺少module,export,require,global四个环境变量,如需使用要用工具转换。
commonJs采用同步加载不同模块文件,适用于服务端。因为模块文件都存放在服务器的各个硬盘上没读取加载时间快,适合服务端,不适用浏览器。
1 | //index.js |
异步加载模块,允许指定回调函数,等模块异步加载完成后即可调用回调函数。
AMD核心思想就是通过define定义一个模块,然后使用require来加载一个模块
将一个复杂的程序依据一定的规则规范封装成几个块文件,并进行组合在一起。
内部数据与实现是私有的,只是向外暴露一些接口方法与外部其他模块通信。
1.全局function模式-把不同的功能封装成不同的全局函数
2.命名空间模式-基于简单的对象封装,
劣势:数据不安全,外部可以直接修改模块内部的数据;所有成员都暴露在外;
1 | let obj = { |
3.匿名函数自执行方式(闭包)
向window对象上添加全局属性,也有的把这种方法叫做添加命名空间,目的是向外暴露接口,其实这种方式很好,方法是私有的,只能通过外部接口来小左,但是多个模块有依赖关系的时候就不好办了。
1 | <script type="text/javascript> |
4.匿名函数的模式增加:向入口传入依赖的模块
官方文档: https://vuex.vuejs.org/zh/
组件之间共享数据的方式
vuex是一个状态管理模式,适用于多个组件共享同一状态时的场景,这里状态也可以理解为数据变量。
使用vuex好处:
若想系统学习Promise可以阅读:阮一峰大神写的Promise对象,此篇记录常用用法。
1 | /** |
1 | /** |
1 | let tasks = []; |
若想系统学习Promise可以阅读:阮一峰大神写的Promise对象,此篇记录常用用法。
方法1——连续使用then链式调用
方法2——使用promise构建队列
方法3——使用async、await实现类似同步编程,async函数内部实现同步
参考:https://www.jianshu.com/p/dbda3053da20
1 | function getA(){ |