使用webpack打包library
如果想要使用webpack打包一个开发库供其他人使用,需要进行相应的配置。
学习了一下,记录下来,其实主要是翻译的官方文档。
开发一个库
假设我们在写一个库,叫做webpack-numbers
,长这个样子:
src/index.js
1 | import _ from 'lodash'; |
我们的目标是让这个库可以支持多种使用方式:
可以import或者require
1 | import * as webpackNumbers from 'webpack-numbers'; |
也可以在html直接用script引用
1 | <html> |
需求
我们期望打包具有以下特性:
- 不会将
lodash
打包进去,可以由使用者自行require。 - 库的名字叫做
webpack-numbers
,变量是webpackNumbers
。 - 库可以使用
import webpackNumbers from 'webpack-numbers'
或require('webpack-numbers')
方式引用。 - 当库是由
script
引入时,可以通过全局变量webpackNumbers
访问。 - 可以在Node.js中使用。
webpack基本配置
webpack.config.js
1 | var path = require('path'); |
externals
项
如果只配置基本选项,会将代码中引用的第三方库一起打包进来,比如说lodash等。
externals
选项可以排除第三方库。
webpack.config.js
1 | module.exports = { |
这样会将ladash
设置为依赖项,需要使用者自己引入到环境。
libraryTarget
项
我们希望自己写的库可以适配多种使用场景,例如CommonJS, AMD, Node.js或者是作为全局变量。
webpack配置中的library
项可以帮助实现这一功能。
webpack.config.js
1 | module.exports = { |
library
选项只是使得打包后的库在import之后作为一个全局对象使用。为了适配更多环境,需要使用libraryTarget
项。
webpack.config.js
1 | module.exports = { |
如果设置了library
而没有设置libraryTarget
,那么libraryTarget
默认为var
。
libraryTarget
的其他配置可见https://webpack.js.org/configuration/output/#output-librarytarget
最后一步
在package.json
中将打包后的bundle设置为main file。
package.json
1 | { |
main
字段是package.json
标准中的内容:
The main field is a module ID that is the primary entry point to your program. That is, if your package is named foo, and a user installs it, and then does require(“foo”), then your main module’s exports object will be returned.
This should be a module ID relative to the root of your package folder.
For most modules, it makes the most sense to have a main script and often not much else.
module
字段是a proposal,目的是使得可以向后兼容的使用ES2015的模块特性。
现在,可以 将库发布到npm上 并且在 unpkg.com上发布给用户了!