一、构建一个 Library
一个第三方 Library,一般是可以通过多种方式引入的,下面介绍了通过 script、CommonJS、AMD、ESModule 方式引入第三方库,Webpack 要做哪些配置。
1. 通过 script 方式引入
假设有以下文件:
// src/index.js
export const add = (x, y) => {
return x + y
}
// webpack.config.js
const path = require("path");
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'mylib.js',
clean: true,
library: 'mylib', // 将 mylib.js 作为一个包导出
}
}
上面代码,由于 index.js 中只是导出了一个 add 方法,并没有使用,所以在打包时,Webpack 会进行 Tree shaking,将没有用到的代码移除,得到打包后的 bundle 将是一个空文件。设置了 output.library 之后,意味着告诉 Webpack 将导出的文件作为一个包,由此得到的 bundle 就不是一个空文件。
至此,打包出的 mylib 这个包已经可以通过 script 标签使用了。如:
<!-- demo/index.html -->
<script src="../dist/mylib.js"></script>
<script>
console.log('mylib:', mylib)
console.log(mylib.add(1, 2))
</script>
在浏览器中查看:
2. 通过 CommonJS、AMD 方式引入
现在,我们希望不仅能通过 script 标签的方式引入,还可以通过 CommonJS、AMD 的方式引入,该如何配置呢?
// webpack.config.js
module.exports = {
output: {
library: {
name: 'mylib',
type: 'umd' // umd 可以支持 script、CommonJS、AMD 的方式引入
},
globalObject: 'globalThis' // 指定一个全局的 this 来代替 mylib 中的 self
}
}
通过以上配置,就可以在文件中使用 CommonJS、AMD 的方式引入,如:
// demo/app.js
const { add } = require('../dist/mylib') // CommonJS 方式引入
console.log(add(5, 6))
3. 通过 ESModule 方式引入
// webpack.config.js
module.exports = {
experiments: {
outputModule: true,
},
output: {
library: {
// name: 'mylib', // 当设置 type 为 module 时,name 属性可以不用设置
type: 'module'
},
}
}
通过以上的配置,让我们可以使用 ESModule 的方式引入:
<!-- demo/index.html -->
<script type="module">
import { add } from '../dist/mylib.js'
console.log('add:', add)
console.log(add(1, 2))
</script>
在浏览器中查看效果:
二、构建一个小轮子并发布为 npm package
发布为 npm package
-
查看当前 registry 是否为 npm 官网地址(
https://registry.npmjs.org/)npm config get registry -
如果不是官网的地址,需要切换回官网的
nrm ls nrm use npm npm config get registry -
修改 package.json
{ "name": "webpack-numbers-barrydong", // name 就是包的名字,应该确保这个包是全世界唯一的 "version": "1.0.0", // 如果更新了包要重新发布,就要修改版本号 "description": "", "main": "dist/webpack-numbers.js", // 指定为打包后的文件,其他人在引用包时会通过 main 去读取文件 "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "lodash": "^4.17.21", "webpack": "^5.72.0", "webpack-cli": "^4.9.2" } } -
登录 npm 账户
npm adduser -
发布
npm publish -
在 npm 官网中点击 Packages 查看已发布的包
最后,我们要自测一下,安装自己的包并使用,看看有没有问题(轮子测试代码)。
PS:一切都完成后,别忘了把 npm 源切换回来(nrm use taobao)。