前言

将项目中的公共utils方法提取出来,单独打包发布到npm,可以在各项目中直接引入包使用。

1. 技术选型

  • Vue3
  • Typescript
  • Rollup // 轻量级的打包工具,适合用于打包库文件

    2.环境搭建

    1. # -y表示略过所有问答,全部按照yes选项生成
    2. yarn init -y
    3. # 或者用npm
    4. npm init -y

    3. 安装依赖

    ```shell

    安装rollup及其他核心依赖

    yarn add rollup -D yarn add @babel/core -D yarn add rollup-plugin-node-resolve @rollup/plugin-babel @rollup/plugin-commonjs -D yarn add rollup-plugin-vue @vue/compiler-sfc -D

安装rollup-plugin-typescript2能让rollup打包ts文件

yarn add rollup-plugin-typescript2 -D

安装vue3

yarn add vue@next

安装ts

yarn add typescript

  1. <a name="IUt3F"></a>
  2. ### 4. package.json添加脚本命令
  3. ```json
  4. {
  5. "name": "smart-utils",
  6. "version": "1.0.0",
  7. "main": "dist/bundle.esm.js", // 包的入口文件,如果未指定默认是根目录下的index.js
  8. "types": "dist/index.d.ts", // 定义类型声明入口文件
  9. "repository": "your git repository",
  10. "author": "your name",
  11. "license": "MIT",
  12. "scripts": {
  13. "build": "rollup -c" // -c 表示使用rollup config配置文件
  14. },
  15. "dependencies": {
  16. "typescript": "^4.5.5",
  17. "vue": "^3.2.31"
  18. },
  19. "devDependencies": {
  20. "@babel/core": "^7.17.5",
  21. "@rollup/plugin-babel": "^5.3.1",
  22. "@rollup/plugin-commonjs": "^21.0.2",
  23. "@vue/compiler-sfc": "^3.2.31",
  24. "rollup": "^2.68.0",
  25. "rollup-plugin-node-resolve": "^5.2.0",
  26. "rollup-plugin-terser": "^7.0.2",
  27. "rollup-plugin-typescript2": "^0.31.2",
  28. "rollup-plugin-vue": "^6.0.0"
  29. }
  30. }

5. 编写入口文件

  1. smart-utils
  2. ├─ src
  3. ├── utils
  4. ├── index.ts
  5. ├── index.ts /入口文件
  6. └── ...
  1. // index.ts
  2. export * from './src/utils/index'

6. 根目录创建rollup配置文件 rollup.config.js

  1. import resolve from "rollup-plugin-node-resolve"
  2. import vue from "rollup-plugin-vue"
  3. import babel from "@rollup/plugin-babel"
  4. import commonjs from "@rollup/plugin-commonjs"
  5. import typescript from 'rollup-plugin-typescript2'
  6. // import { terser } from 'rollup-plugin-terser';
  7. import {name} from './package.json'
  8. const mode = process.env.MODE;
  9. const isProd = mode === 'prod';
  10. const extensions= ['.js', '.ts', '.vue']
  11. const config = {
  12. input: "./main.ts", // 必须,入口文件
  13. output: [{ // 必须 (如果要输出多个,可以是一个数组)
  14. file: 'dist/bundle.esm.js',
  15. name,
  16. format: 'esm', // es module形式
  17. }, {
  18. file: 'dist/bundle.cjs.js',
  19. name,
  20. format: 'cjs' // CommonJS,适用于 Node 和 Browserify/Webpack
  21. }],
  22. external: ['element-plus', 'vue'], // 剔除项,指出应将哪些模块视为外部模块,视为外部模块的模块不会打包进去
  23. plugins: [
  24. resolve({ extensions, browser: true}), // rollup-plugin-node-resolve插件可以告诉 Rollup 如何查找外部模块
  25. vue({
  26. css: true,
  27. compileTemplate: true
  28. }),
  29. babel({
  30. exclude: "**/node_modules/**"
  31. }),
  32. typescript(),
  33. commonjs(), // rollup-plugin-commonjs 插件用来将 CommonJS 转换成 ES2015 模块
  34. // terser() // 用于代码压缩,根据实际情况选用
  35. ]
  36. }
  37. export default config

7. 新建ts编译配置文件tsconfig.json

  1. {
  2. "compilerOptions": {
  3. "baseUrl": ".",
  4. "moduleResolution": "node",
  5. "target": "esnext",
  6. "module": "esnext",
  7. "strict": true,
  8. "skipLibCheck": true,
  9. "declaration": true, // 生成类型声明文件
  10. "declarationDir": "dist", // 生成类型声明文件的目录
  11. "paths": {
  12. "*": ["types/*"]
  13. }
  14. },
  15. "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
  16. "exclude": ["node_modules"]
  17. }

8. 打包

  1. yarn build

9. 登录npm, 发布包

  1. # 登录
  2. npm login
  3. # 发布
  4. npm publish


进行到这里一份简单的rollup打包流程已经跑通了,可以在项目里安装刚发布的包并进行引用了。

tips1: 在调试过程中发现每次修改内容都需要修改包的版本号然后发布,然后再在项目中引入测试,这样比较麻烦,我们可以采用npm link的方式解决。

  1. 在开发的包中执行命令: npm link
  2. 在需要引入该包的项目中执行:npm link [包名] 并启动项目就可以实时进行调试测试

tips2:想要升级包版本的时候可以使用命令自动升级

  1. # 假设当前version: 1.0.0
  2. # 提示主版本号,version 变为2.0.0
  3. npm version major
  4. # 提升次版本号,version 变为1.1.0
  5. npm version minor
  6. # 提升补丁号,version 变为1.0.1
  7. npm version patch