之前我们打包的都是开发业务代码,如何打包一个库代码供别人使用呢?

library

例如新建项目**library**

  1. library
  2. ├─package-lock.json
  3. ├─package.json
  4. ├─webpack.config.js
  5. ├─src
  6. | ├─index.js
  7. | ├─math.js
  8. | string.js

打包入口文件:

  1. import * as math from './math';
  2. import * as string from './string';
  3. export default {
  4. math,
  5. string
  6. }

**math.js**文件导出几个数学相关方法:

  1. export function add(a, b) {
  2. return a + b;
  3. }
  4. export function minus(a, b) {
  5. return a - b;
  6. }
  7. export function multiply(a, b) {
  8. return a * b;
  9. }
  10. export function division(a, b) {
  11. return a / b;
  12. }

**string.js**文件导出一个字符串的方法:

  1. export function join(a, b) {
  2. return a + "" + b;
  3. }

**Webpack**配置文件就是一些最基本的配置内容:

  1. const path = require("path");
  2. module.exports = {
  3. mode: "production",
  4. entry: "./src/index.js",
  5. output: {
  6. path: path.resolve(__dirname, "dist"),
  7. filename: "[name].js",
  8. }
  9. }

这样一份简单的打包配置就做好了,但是呢我们的项目是一个代码库需要供别人使用的,别人会有很多种引入的方式,就像这样:

  1. // 第一种 ESModule
  2. import library from "library";
  3. // 第二种 ComonJS
  4. const library = require("library");
  5. // 第三种 AMD
  6. require(["library"],()=>{});
  7. // 第四种 script
  8. <srcript src="library"></script>

如果想让支持外部文件任何方式都可以引入我们的库就需要进行一个配置:

  1. const path = require("path");
  2. module.exports = {
  3. mode: "production",
  4. entry: "./src/index.js",
  5. output: {
  6. path: path.resolve(__dirname, "dist"),
  7. filename: "[name].js",
  8. // 不管是什么引入方式都可以使用(支持 CMD、AMD、ESModule)
  9. libraryTarget: "umd",
  10. // 支持 srcipt 标签引入,并生成全局变量
  11. library: "library"
  12. }
  13. }

externals

Webpack中文:
外部扩展(Externals) | webpack 中文文档

假设我们的代码库引入了loadsh库,然后发布到了npm网站 ,别人在使用我们代码库的时候也引入了loadsh库,这就导致了重复加载。

  1. import _ from 'loadsh'
  2. export function join(a, b) {
  3. return _.join(["a", "b"], "~");
  4. }

如何避免一个库重复引入呢?
需要配置externals,这样别人在用我们库的时候就需要他自己引入啦。

  1. const path = require("path");
  2. module.exports = {
  3. mode: "production",
  4. entry: "./src/index.js",
  5. // 打包的过程中忽略 loadha 库,让别人的业务代码加载 loadsh
  6. externals: ["loadsh"],
  7. output: {
  8. path: path.resolve(__dirname, "dist"),
  9. filename: "[name].js",
  10. // 不管是什么引入方式都可以使用(支持CMD、AMD、ESModule)
  11. libraryTarget: "umd",
  12. // 支持 srcipt 标签引入,并生成全局变量
  13. library: "library"
  14. }
  15. }

最后我们写完自己的代码包需要部署到npm网站噢。