夏天夏 夏天夏
首页
  • 技术分享

    • 小白都能看懂的闭包
    • 关于后台管理应用
    • 关于技术的取舍
    • 前端工程化
    • 切换node版本
    • 如何优雅的写事件代理
    • 我所不了解的技术
    • 我喜欢的parcel
    • angular1使用
    • npm script打造前端工作流
  • 发布一个node插件

    • 发布一个npm包
    • 如何打包一个插件工具库
    • 打包工具的选择
  • 年终总结

    • 2019年总结
    • 2020年总结
    • 2021年总结
  • JavaScript
  • CSS
  • 框架
  • Node
  • 服务
  • web3
  • 其他
我的作品
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

夏天夏

我也不饶岁月
首页
  • 技术分享

    • 小白都能看懂的闭包
    • 关于后台管理应用
    • 关于技术的取舍
    • 前端工程化
    • 切换node版本
    • 如何优雅的写事件代理
    • 我所不了解的技术
    • 我喜欢的parcel
    • angular1使用
    • npm script打造前端工作流
  • 发布一个node插件

    • 发布一个npm包
    • 如何打包一个插件工具库
    • 打包工具的选择
  • 年终总结

    • 2019年总结
    • 2020年总结
    • 2021年总结
  • JavaScript
  • CSS
  • 框架
  • Node
  • 服务
  • web3
  • 其他
我的作品
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 技术分享

    • 小白都能看懂的闭包
    • 关于后台管理应用
    • 关于技术的取舍
    • 前端工程化
    • 切换node版本
    • 如何优雅的写事件代理
    • 我所不了解的技术
    • 我喜欢的parcel
    • angular1使用
    • 使用npm script打造前端工作流
    • 发布一个npm包
    • 如何打包一个插件工具库
      • 工具类
        • 使用 webpack
        • 使用 rollup
        • 点击查看源码
    • 打包工具的选择
  • 年终总结

  • 个人博客
  • 技术分享
夏天夏
2022-05-27
目录

如何打包一个插件工具库

# 工具类

下面,我们就打包一个简单的工具函数,对此 js 文件分别进行 webpack 和 rollup 的打包

// index.js
function add(a, b) {
  return a + b;
}
export { add };
1
2
3
4
5

打包之前我们先配置一些 package.json

{
  "name": "tools",
  "version": "0.0.1",
  "description": "",
  "main": "dist/eff.cjs.js", //包文件入口位置 默认index.js,应该放commonJs(cjs)模块,以require的方式引入模块
  "module": "dist/eff.esm.js", //这里放es module(esm)模块,以import的方式引入模块应
  "jsnext:main": "dist/eff.esm.js", //跟module一样,只是jsnext:main是社区支持的。而 module 则是官方字段,大量社区插件只认识jsnext:main所以建议"module"和"jsnext:main"一起使用

  "browser": "dist/eff.browser.js", //可不通过编译直接在scrip src='dist/eff.browser.js'使用,但是打包时需要暴露出一个变量,可以直接在scrip标签中调用此变量
  "scripts": {
    "build:webpack": "webpack --config webpack.build.config.js", //使用webpack打包
    "build:rollup": "npx rollup -c rollup.config.js" //使用rollup打包
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 使用 webpack

// webpack.build.config.js
const path = require("path");

var config = { module: {} };
var umd = Object.assign({}, config, {
  entry: {
    "eff.cjs": path.resolve(__dirname, "src/index.js"),
    "eff.browser": path.resolve(__dirname, "src/index.js"),
  },
  output: {
    path: path.resolve(__dirname, "./dist"),
    filename: "[name].js",
    library: {
      type: "umd",
    },
    globalObject: "this", // 定义全局变量,兼容node和浏览器运行,避免出现"window is not defined"的情况
  },
});
var esm = Object.assign({}, config, {
  entry: {
    "eff.esm": path.resolve(__dirname, "src/index.js"),
  },
  output: {
    path: path.resolve(__dirname, "./dist"),
    filename: "[name].js",
    library: {
      type: "module",
    },
  },
  experiments: {
    outputModule: true,
  },
});

// Return Array of Configurations
module.exports = [esm, umd];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# 使用 rollup

// rollup.config.js
import pkg from "./package.json";
import json from "rollup-plugin-json";
import resolve from "rollup-plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import { babel } from "@rollup/plugin-babel";
import { terser } from "rollup-plugin-terser";
import filesize from "rollup-plugin-filesize";
const formatName = "eff";
export default {
  input: "./src/index.js",
  output: [
    {
      file: pkg.main,
      format: "cjs",
    },
    {
      file: pkg.module,
      format: "esm",
    },
    {
      file: pkg.browser,
      format: "umd",
      name: formatName,
    },
  ],
  plugins: [
    terser(),
    filesize(),
    json(),
    commonjs({
      include: /node_modules/,
    }),
    resolve({
      preferBuiltins: true,
      jsnext: true,
      main: true,
      brower: true,
    }),
    babel({ exclude: "node_modules/**" }),
  ],
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

# 点击查看源码 (opens new window)

编辑 (opens new window)
#npm
上次更新: 2022/06/01, 09:55:08
发布一个npm包
打包工具的选择

← 发布一个npm包 打包工具的选择→

最近更新
01
远程办公的个人思考
02-21
02
SEO
01-02
03
NFT的价值
12-27
更多文章>
Theme by Vdoing | Copyright © 2019-2025 夏天夏 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式