写点什么

webpack | 进阶用法 3:如果将代码打包成一个通用 JS 库。

用户头像
梁龙先森
关注
发布于: 2021 年 02 月 02 日
webpack | 进阶用法3:如果将代码打包成一个通用JS库。

需求:

  1. 需要打包压缩和非压缩两版本

  2. 支持 AMD/CJS/ESM 模块导入

1. 打包的库使用方式
  1. ES module

import * as largeNumber from 'large-number.js'var v = largeNumber.add(1,1)
复制代码
  1. CommonJS

var largeNumber = require('large-number.js')var v = largeNumber.add(1,1)
复制代码
  1. AMD

require(['large-number.js'],function(largeNumber){  var v = largeNumber.add(1,1)})
复制代码
  1. script 标签加载使用库

<script src="large-number.js"></script><script>	var v = largeNumber.add(1,1)</script>
复制代码
2. 构建配置
const TerserPlugin = require('terser-webpack-plugin')module.exports = {  mode:'production',	entry:{  	'math':'./src/index.js',    'math.min':'./src/index.js'  },  output:{  	filename:'[name].js',    library:'largeNumber', // 执行库的全局变量    libraryTarget:'umd',   // 支持库的引用方式    libraryExport:'default'  },  optimization:{		minize:true,  	minimizer:[  		new TerserPlugin({ // 压缩打包				include:/\.min\.js$/,			})  	]	}}
复制代码

暴露库的方式有以下几种:

  • 变量:作为一个全局变量,通过 script 标签来访问(libraryTarget:'var')。

  • this:通过 this 对象访问(libraryTarget:'this')。

  • window:通过 window 对象访问,在浏览器中(libraryTarget:'window')。

  • UMD:在 AMD 或 CommonJS 的 require 之后可访问(libraryTarget:'umd')。

如果设置了 library 但没设置 libraryTarget,则 libraryTarget 默认为 var.

3. 配置 package.json

包的引用入口文件,配置 package.json 的 main 字段为 index.js,并书写代码如下:

if(process.env.NODE_ENV === 'production'){  module.exports = require('./dist/large-number.min.js')}else{  module.exports = require('./dist/large-number.js')}
复制代码
5. 附录

浅谈Webpack的本质

Loader处理非JavaScript模块详解

Plugin事件流机制详解

浅谈Webpack原理,以及loader和plugin实现

wepback进阶用法1:多入口构建/资源内联/脚本分离等

webpack进阶用法2:代码分割和动态引入的实现方式

webpack进阶用法3:如果将代码打包成一个通用JS库

webpack 进阶用法 4:构建速度和体积优化策略(待发布)

webpack 进阶用法 5:持续集成,Travis CLI 使用(待发布)


发布于: 2021 年 02 月 02 日阅读数: 26
用户头像

梁龙先森

关注

脚踏V8引擎的无情写作机器 2018.03.17 加入

还未添加个人简介

评论

发布
暂无评论
webpack | 进阶用法3:如果将代码打包成一个通用JS库。