22. Library

207 阅读2分钟

一、构建一个 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>

在浏览器中查看:

image.png

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>

在浏览器中查看效果:

image.png

二、构建一个小轮子并发布为 npm package

轮子代码

发布为 npm package

  1. 查看当前 registry 是否为 npm 官网地址(https://registry.npmjs.org/

    npm config get registry
    

    image.png

  2. 如果不是官网的地址,需要切换回官网的

    nrm ls
    nrm use npm
    npm config get registry
    

    image.png

  3. 修改 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"
      }
    }
    
  4. 登录 npm 账户

    npm adduser
    

    image.png

  5. 发布

    npm publish
    
  6. 在 npm 官网中点击 Packages 查看已发布的包

    image.png

最后,我们要自测一下,安装自己的包并使用,看看有没有问题(轮子测试代码)。

PS:一切都完成后,别忘了把 npm 源切换回来(nrm use taobao)。