08.ElementUI 2.X 源码学习:源码剖析之工程化(三)
0x.00 前言
项目工程化系列文章链接如下,推荐按照顺序阅读文章 。
1️⃣ 源码剖析之工程化(一):项目概览、package.json、npm script
2️⃣ 源码剖析之工程化(二):项目构建、MD解析
3️⃣ 源码剖析之工程化(三):打包配置
本系列文章主要通过解析element项目源码,从结构、功能、源码方面逐一解析,学习其模块化、组件化、规范化、自动化等多维度优秀实践。主要内容包含项目结构、npm script、项目构建、文档解析、打包配置、发布部署等。
本文是第三篇,介绍项目的打包配置功能。
0x.01 打包配置
项目中
webpack
版本为4.X
,文中涉及语法、功能与最新版本5.X
相比存在变化。
commonjs vs commonjs2
接下来配置 libraryTarget
的选项中可以看到'commonjs'、'commonjs2'。两者之前的有什么区别?
commonjs
规范只定义了exports
, 而 module.exports
是nodejs
对commonjs
的实现, 这种扩展实现称为commonjs2
。
// commonjs
exports.a = 'a';
exports.b = 'b';
// commonjs2
module.exports = {
a : 'a',
b : 'b'
};
build/config.js
文件内容是打包配置的公用配置。
外部扩展(externals) 从输出的 bundle 中排除依赖,在运行时(runtime)从外部获取这些扩展依赖(external dependencies),主要解决组件依赖导致代码冗余问题。其中 exports.externals = externals;
内容格式如下 。
build/webpack.common.js
以 commonjs2
规范打包构建类库。
- 调用命令:
webpack --config build/webpack.common.js
。 - 入口文件:
src/index.js
。 - 输出文件:以
commonjs2
规范构建输出到lib/element-ui.common.js
(类库主入口文件)。
build/webpack.component.js
以 commonjs2
规范对每个组件单独打包构建,支持按需引入。
- 调用命令:
webpack --config build/webpack.component.js
。 - 入口文件:
components.json
中的组件列表。 - 输出文件:把
packages
目录下的组件,以commonjs2
规范单独构建输出到lib/components-name.js
。
build/webpack.conf.js
以 umd
规范打包构建类库,不仅可以 NodeJs 环境使用,也可以在浏览器环境(browser)使用,需要设置umdNamedDefine: true
。
- 调用命令:
webpack --config build/webpack.conf.js
。 - 入口文件:
src/index.js
。 - 输出文件:以
umd
规范构建输出到lib/index.js
。
externals 配置
通过这种方式引入的依赖库,不会打包到 bundle 中。以下任何一种形式在各种模块上下文使用:
root
:可以通过一个全局变量访问 library(例如,通过 script 标签)。commonjs
:可以将 library 作为一个 CommonJS 模块访问。commonjs2
:和上面的类似,但导出的是 module.exports.default。amd
:类似于 commonjs,但使用 AMD 模块系统。
一个形如 { root, amd, commonjs, ... }
的对象仅允许用 libraryTarget: 'umd'
这样的配置.
// 防止将某些 import 的包(package)打包到 bundle 中,
// 在运行时(runtime)再去从外部获取这些扩展依赖
externals: {
// config.vue
// {
// root: 'Vue',
// commonjs: 'vue',
// commonjs2: 'vue',
// amd: 'vue'
// }
vue: config.vue
},
生成lib\index.js
中,依赖库vue
引入声明代码如下:
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("vue"));
else if(typeof define === 'function' && define.amd)
define("ELEMENT", ["vue"], factory);
else if(typeof exports === 'object')
exports["ELEMENT"] = factory(require("vue"));
else
root["ELEMENT"] = factory(root["Vue"]);
})
build/webpack.demo.js
提供了两套打包配置,生产模式用于项目网站的构建,开发模式用于组件展示测试的构建。使用了CSS、JS构建的优化插件,还配置 splitChunks
抽取公共模块解决重复引入第三方库的问题。
npm run deploy:build
命令打包构建项目网站。
- 调用命令:
webpack --config build/webpack.demo.js
。 - 模式:
production
。 - 入口文件:
examples/entry.js
。 - 输出文件:构建内容输出至
examples/element-ui/
目录下。
npm run deploy:build
命令打包运行项目网站,用于开发调试。
- 调用命令:
webpack-dev-server --config build/webpack.demo.js
。 - 模式:
development
。 - 入口文件:
examples/entry.js
。 - 输出文件:构建内容输出至
examples/element-ui/
目录下。
npm run dev:play
命令用于组件库开发中的功能展示。
- 调用命令:
webpack-dev-server --config build/webpack.demo.js
。 - 模式:
development
。 - 入口文件:
examples/entry.js
。 - 输出文件:构建内容输出至
examples/element-ui/
目录下。
build/webpack.extension.js
用于构建名为Element Theme Roller
的 chorme 插件项目,复用大部分 webpack.demo.js
打包配置。npm run deploy:extension
用于项目生产发布;npm run dev:extension
用于开发调试。
- 调用命令:
webpack --config build/webpack.extension.js
。 - 入口文件:
examples/extension/src/background.js
和examples/extension/src/entry.js
。 - 输出文件:构建内容输出至
examples/extension/dist
目录下。生成文件background.js
entry.js
,复制文件icon.png
manifest.json
。
build/webpack.test.js
项目未使用此打包配置,入口src/index.js
,打包构建文件dist/app.js
,具体作用未知。
0x.02 链接汇总
点击以下链接,可以快速查看本系列其他文章:
0x.03 参考
https://webpack.docschina.org/configuration/
08.ElementUI 2.X 源码学习:源码剖析之工程化(三)的更多相关文章
- 07.ElementUI 2.X 源码学习:源码剖析之工程化(二)
0x.00 前言 项目工程化系列文章链接如下,推荐按照顺序阅读文章 . 1️⃣ 源码剖析之工程化(一):项目概览.package.json.npm script 2️⃣ 源码剖析之工程化(二):项目构 ...
- Dapper源码学习和源码修改
之前ORM比较火热,自己也搞了个WangSql,但是感觉比较low,大家都说Dapper性能好,所以现在学习学习Dapper,下面简单从宏观层面讲讲我学习的Dapper. 再了解一个东西前,先得学会使 ...
- Dapper源码学习和源码修改(下篇)
目录: Dapper源码学习和源码修改(上篇主要讲解入参解析) Dapper源码学习和源码修改(下篇主要讲解出参解析) 继上篇讲了下自己学习Dapper的心得之后,下篇也随之而来,上篇主要讲的入参解析 ...
- 06.ElementUI 2.X 源码学习:源码剖析之工程化(一)
0x.00 前言 在用了5章篇幅 ElementUI源码学习:从零开始搭建Vue组件库汇总 讲解了如何编写一个组件.发布npm以及生成展示文档之后.接下来将分析Element项目的代码结构,学习其工程 ...
- Mysql源码学习——源码目录结构
目录清单 目录名 注释 Bdb 伯克利DB表引擎 BUILD 构建工程的脚本 Client 客户端 Cmd-line-utils 命令行工具 Config 构建工程所需的一些文件 Dbug Fred ...
- Spring源码学习
Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...
- 05.ElementUI源码学习:项目发布配置(github pages&npm package)
0x00.前言 书接上文.项目第一个组件已经封装好,说明文档也已编写好.下面需要将说明文档发布到外网上,以此来展示和推广项目,使用 Github Pages功能实现.同时将组件发布之 npm 上,方便 ...
- git 源码学习(init-db) 提交版本号 083c516331
写在前面的废话: 学完git之后,还是感觉云里雾里的,于是乎,就想到了通过学习git源码,来加深git的熟练度,同时学习一下c语言编程. git源码学习,逐步分析 这篇帖子是逐步分析git源码的,将g ...
- 如何实现全屏遮罩(附Vue.extend和el-message源码学习)
[Vue]如何实现全屏遮罩(附Vue.extend和el-message源码学习) 在做个人项目的时候需要做一个类似于电子相册浏览的控件,实现过程中首先要实现全局遮罩,结合自己的思路并阅读了(饿了么) ...
随机推荐
- creating a table and inserting data
/** Grocery list: Bananas (4) Peanut Butter (1) Dark Chocolate Bars (2) **/ CREATE TABLE groceries ( ...
- 让vim显示空格,tab字符,及vim多行注释
1.显示 TAB 键 文件中有 TAB 键的时候,你是看不见的.要把它显示出来: :set list 现在 TAB 键显示为 ^I,而 $显示在每行的结尾,以便你能找到可能会被你忽略的空白字符在哪里 ...
- 微信小程序中的自定义组件
微信小程序中的组件 前言 之前做小程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,当时官方对这方面的文档也只是寥寥几句,一笔带过而已,所以写起来真的是非常非常痛苦!! 好在微信小程序的库从 ...
- 给HTML5 Video 设置多语言字幕文件
现在各种支持HTML5的浏览器都能够播放html5视频了,但是对于字幕的支持却很少,我们期待像DVD那样强大的字幕. 往往我们还不得不通过js来做,着实是一件痛苦的事情. 现在IE10率先对HTML5 ...
- Android Hook学习之ptrace函数的使用
Synopsis #include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t pid, void *a ...
- Android敲诈者病毒“安卓性能激活”分析(2015年9月版)
一.情况简介 前几天分析了论坛里的一个Android敲诈者病毒,感觉还是很有收获,后面有空多研究研究Android病毒.说句题外话, 根据前面分析的Android敲诈者病毒的隐藏手法,应该可以实现&q ...
- hdu4971 流-最大权闭包
题意: 给了一些任务,然后给了一些完成某些任务的限制,然后又给了限制之间的拓扑关系,最后问你最大收益. 思路: 很直白,就是流的一个应用,最大权闭包,没涉及到什么想法的地方,建 ...
- Linux-鸟菜-5-目录配置-FHS
Linux-鸟菜-5-目录配置-FHS 这节内容比较休闲,主要就是介绍Linux的目录配置,也就是那些目录通常是干啥的,这个比较重要,需要我们去了解.但是我觉得通常看一遍记不住啥,也就记个大概,主要还 ...
- LeetCode---11. 盛最多水的容器(Java)
11. 盛最多水的容器 题目地址:https://leetcode-cn.com/problems/container-with-most-water/ 给你 n 个非负整数 a1,a2,...,an ...
- Day004 Scanner进阶
Scanner进阶 例1 Scanner scanner = new Scanner(System.in); //从键盘接收数据 int i = 0; float f = 0.0f; System.o ...