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 标签来访问,默认值为 var

    • this:通过 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 直接访问的

详解webpack的out.libraryTarget属性open in new window

webpack-创建 libraryopen in new window

Last Updated:
Contributors: 156081289@qq.com