前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >webpack打包Library库文件指南

webpack打包Library库文件指南

作者头像
砖业洋__
发布2023-05-06 20:17:53
3160
发布2023-05-06 20:17:53
举报
文章被收录于专栏:博客迁移同步博客迁移同步

本文示例仓库地址: https://github.com/liuchenyang0515/Library_pack

当自己写了一个js想让其他业务方引入,但是别人可能有很多种方式引入库文件,所以我们需要满足别人各种可能的引入方式。

可能是ES6 Module方式导入

代码语言:javascript
复制
import library from 'library';

可能是commonjs方式导入

代码语言:javascript
复制
const library = require('library');

也可能用amd语法引入这个库文件

代码语言:javascript
复制
require(['library'], function() {
	
})

还可能直接用<script>标签引入

代码语言:javascript
复制
<script src="./library.js"></script>

来个例子,我们先新建3个js文件 math.js如下

代码语言:javascript
复制
export function add (a, b) {
    return a + b;
}
export function minus (a, b) {
    return a - b;
}
export function multiply (a, b) {
    return a * b;
}
export function division (a, b) {
    return a / b;
}

string.js如下

代码语言:javascript
复制
export function join(a, b) {
    return a + " " + b;
}

index.js如下

代码语言:javascript
复制
import math from './math'
import string from './string'
export { math, string }

此时我们可以在webpack配置文件output里面添加一项属性libraryTarget:'umd',这是什么意思呢? UMD的全称是Universal Module Definition ,也就是通用模块标准,它的目标是使一个模块能运行在各种环境下,不论是CommonJSAMDES6 Module或者非模块化环境都能正确引入到库文件

代码语言:javascript
复制
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'library.js',
        libraryTarget: 'umd'
    }

但是如果我想要别人在用<script>标签引入的时候,能在全局访问到这个模块从而访问mathstring里面的函数应该怎么做呢? 在output里面继续添加一项属性library:mylib

代码语言:javascript
复制
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'library.js',
        library: 'mylib',
        libraryTarget: 'umd'
    }
在这里插入图片描述
在这里插入图片描述

<script>引入这个js 后发现mylib是在window里面的,直接可以打印,如果不配置这个属性library:mylib,控制台会显示mylib is not defined

安装第三方模块npm i lodash -S,修改string.js

代码语言:javascript
复制
import _ from 'lodash'
export function join(a, b) {
    return _.join([a, b], ' ');
}

开始打包

此时我的library.js里面就有了lodash.js,然而需求方的业务代码可能也有 需要引入lodash模块,那么他的引入很可能如下

代码语言:javascript
复制
import library from 'library'
import _ from 'lodash'

这样需求方打包我们的代码和lodash模块代码,这样就打包了2次lodash,增大了体积。 我们可以这样做在module.exports里面写上externals: ["lodash"],代表打包过程需要忽略的库是lodash。 接着打包看看

在这里插入图片描述
在这里插入图片描述

明显看得到前面72.8KB变成了1.64KB 但是这样我们打包出的库文件就不能直接用了,这里会依赖lodash,所以引入library的时候必须同时引入lodash了。

代码语言:javascript
复制
import _ from 'lodash'
import library from 'library'

这样既避免了两次lodash的打包,又能让我们的程序正确运行。 为了方便第三方引入,你可以在写文档的时候注明,引入本js前必须引入lodash,然后给一个引入示例,别人就看得懂了

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档