# library
平时很少用到 library 配置,这个配置的使用场景一般用于开发库的时候
回想一下,当我们引入别人开发的类库时有几种方式?下面假设我们引入一个 demo 方法:
传统方式:script标签
<script src="demo.js"></script>
<script>demo();</script>
这个需要 demo.js 中全局定义 demo 方法
commonjs 方式
const demo = require('demo');
demo();
这个需要 demo.js 实现 module.exports = { demo: Function }
ES6 module
import demo from 'demo';
demo();
这个需要 demo.js 实现 export.default = Function
如果不用 library 我们可能需要一一实现上面几种导出方法,所以使用 library 就可以自动帮我们处理这些事件
先来一个没用 library 的简单的 Demo
// src/index.js
function doDemo(){
console.log('demo')
}
doDemo()
// webpack.confing.js
module.exports = {
mode: 'development',
entry: './src/index.js',
output: {
filename: 'demo.js', // 输出文件的文件
path: path.resolve(process.cwd(), 'dist'),
},
}
'demo'
typeof doDemo // "undefined"
打包运行过控制台将输出 demo,但是此时模块外并没有 doDemo 方法,接下来就是利用 library 暴露 deDemo 方法
# library使用
使用 library 需要与 libraryTarget 同时使用
library: 暴露出去的模块名字libraryTarget: 暴露方式,可选项有:var:作为一个全局变量,那么就可以通过 script 标签来访问,默认值为
varthis:通过 this 对象访问
window:在浏览器中通过 window 对象访问
umd:通过 AMD 或 CommonJS require 形式访问
修改 webpack.config.js 配置
var
先试一下 libraryTarget: var 的效果
module.exports = {
mode: 'development',
entry: './src/index.js',
output: {
filename: 'demo.js', // 输出文件的文件
path: path.resolve(process.cwd(), 'dist'),
library: 'doDemoLib', // 暴露出去的名字,随便取
libraryTarget: 'var'
},
}
打包后运行:
demo
typeof doDemoLib // "object"
doDemoLib // {}
此时在模块外就多了一个 doDemoLib 对象,但是这个对象并没有我们定义的 deDemo 方法,因为我们没有将 deDemo 导出,继续修改
export function demo(){
console.log('demo')
}
demo()
查看结果:
demo
typeof doDemoLib // "object"
doDemoLib // { doDemo: F}
doDemoLib.doDemo() // demo
this
// webpack.config.js
output: {
filename: 'demo.js', // 输出文件的文件
path: path.resolve(process.cwd(), 'dist'),
library: 'doDemoLib', // 暴露出去的名字,随便取
libraryTarget: 'this'
}
输出结果:
demo
typeof this.doDemoLib // "object"
this.doDemoLib // { doDemo: F}
this.doDemoLib.doDemo() // demo
doDemoLib 挂载在了 this 对象上,在浏览器中相当于 window 对象了,所以libraryTarget: 'window' 也是同理
umd
// webpack.config.js
output: {
filename: 'demo.js', // 输出文件的文件
path: path.resolve(process.cwd(), 'dist'),
library: 'doDemoLib', // 暴露出去的名字,随便取
libraryTarget: 'umd'
}
此时打包出来的 demo.js 就可以被其它模块以 AMD 或 CommonJS 形式访问
不仅如此,使用 umd 打包后的模块也是可以直接以 script 标签引入或者通过 this 直接访问的