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.exportsnodejscommonjs的实现, 这种扩展实现称为commonjs2

// commonjs
exports.a = 'a';
exports.b = 'b'; // commonjs2
module.exports = {
a : 'a',
b : 'b'
};

参考https://github.com/webpack/webpack/issues/1114

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.jsexamples/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 链接汇总

点击以下链接,可以快速查看本系列其他文章:

ElementUI源码学习:从零开始搭建Vue组件库汇总

0x.03 参考

https://webpack.docschina.org/configuration/

08.ElementUI 2.X 源码学习:源码剖析之工程化(三)的更多相关文章

  1. 07.ElementUI 2.X 源码学习:源码剖析之工程化(二)

    0x.00 前言 项目工程化系列文章链接如下,推荐按照顺序阅读文章 . 1️⃣ 源码剖析之工程化(一):项目概览.package.json.npm script 2️⃣ 源码剖析之工程化(二):项目构 ...

  2. Dapper源码学习和源码修改

    之前ORM比较火热,自己也搞了个WangSql,但是感觉比较low,大家都说Dapper性能好,所以现在学习学习Dapper,下面简单从宏观层面讲讲我学习的Dapper. 再了解一个东西前,先得学会使 ...

  3. Dapper源码学习和源码修改(下篇)

    目录: Dapper源码学习和源码修改(上篇主要讲解入参解析) Dapper源码学习和源码修改(下篇主要讲解出参解析) 继上篇讲了下自己学习Dapper的心得之后,下篇也随之而来,上篇主要讲的入参解析 ...

  4. 06.ElementUI 2.X 源码学习:源码剖析之工程化(一)

    0x.00 前言 在用了5章篇幅 ElementUI源码学习:从零开始搭建Vue组件库汇总 讲解了如何编写一个组件.发布npm以及生成展示文档之后.接下来将分析Element项目的代码结构,学习其工程 ...

  5. Mysql源码学习——源码目录结构

    目录清单 目录名 注释 Bdb 伯克利DB表引擎 BUILD 构建工程的脚本 Client 客户端 Cmd-line-utils 命令行工具 Config 构建工程所需的一些文件 Dbug Fred ...

  6. Spring源码学习

    Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...

  7. 05.ElementUI源码学习:项目发布配置(github pages&npm package)

    0x00.前言 书接上文.项目第一个组件已经封装好,说明文档也已编写好.下面需要将说明文档发布到外网上,以此来展示和推广项目,使用 Github Pages功能实现.同时将组件发布之 npm 上,方便 ...

  8. git 源码学习(init-db) 提交版本号 083c516331

    写在前面的废话: 学完git之后,还是感觉云里雾里的,于是乎,就想到了通过学习git源码,来加深git的熟练度,同时学习一下c语言编程. git源码学习,逐步分析 这篇帖子是逐步分析git源码的,将g ...

  9. 如何实现全屏遮罩(附Vue.extend和el-message源码学习)

    [Vue]如何实现全屏遮罩(附Vue.extend和el-message源码学习) 在做个人项目的时候需要做一个类似于电子相册浏览的控件,实现过程中首先要实现全局遮罩,结合自己的思路并阅读了(饿了么) ...

随机推荐

  1. 【cypress】2. 安装Cypress(windows系统),以及cypress open报错解决。

    安装cypress. 一.操作系统 先确认下你的系统,是否在cypress支持范围之内: macOS 10.9 以上 (仅64-bit) Linux Ubuntu 12.04及以上版本,Fedora ...

  2. 2021S软件工程——个人阅读作业1

    2021S软件工程--个人阅读作业1 项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任建) 这个作业的要求在哪里 2021年软工-热身阅读作业 我在这个课程的目标是 了解并熟悉软件开发 ...

  3. new word

    strategy: a plan of action or policy designed to achieve a major or overall aim.

  4. 没有SEO的DiscuzQ 值不值得站长选择?

    此文写于2021年1月22日.至少到今天,Discuz Q 依然没有推出SEO的解决方案. 据官方团队交流说,SEO是在需求池中排在第一位,但目前还没有相应的措施来解决无法SEO. Discuz Q: ...

  5. 02- linux目录和文件的基础操作

    本博文纲要 linux目录结构 绝对路径与相对路径 linux目录常用操作 linux文件常用操作 Q/A Windows文件系统特点 -文件系统是操作系统的一个功能,用户管理目录和文件 -Windo ...

  6. 【HTML】HTML5从入门到深入(复习查漏向

    HTML5从入门到深入(复习查漏向 冷知识 万维网之始:第一个网站·蒂姆伯纳斯-李 HTML5 html5文档类型声明: 头部: <!doctype html> 字符集(charset): ...

  7. Maven关于web.xml中Servlet和Servlet映射的问题

    在配置Servlet时,有两个地方需要配置. 一个是<servlet>,另一个是<servlet-Mapping>,这两个一个是配置Servlet,一个是配置其映射信息. &l ...

  8. 【Mybtais】Mybatis 插件 Plugin开发(一)动态代理步步解析

    需求: 对原有系统中的方法进行'拦截',在方法执行的前后添加新的处理逻辑. 分析: 不是办法的办法就是,对原有的每个方法进行修改,添加上新的逻辑:如果需要拦截的方法比较少,选择此方法到是会节省成本.但 ...

  9. SpringBoot Restful

    SpringBoot Restful 大家在做Web开发的过程中,method常用的值是get和post. 可事实上,method值还可以是put和delete等等其他值. 既然method值如此丰富 ...

  10. 看雪加密解密第一个traceme程序破解

    工具:ollydbg(吾爱破解2.10版) 工具设置:因为traceme是一个win32图形用户程序,所以其程序入口点在WinMain()函数处,设置ollydbg的调试设置的事件选项,选中在WinM ...