解析ElementPlus打包源码(五、copyFiles)

还有最后一个copyFiles,虽然有点水,还是记录下

copyTypesDefinitions 我们之前打包类型已经写过。这里我们只看copyFiles

less 复制代码
export const copyFiles = () =>
  Promise.all([
    copyFile(epPackage, path.join(epOutput, 'package.json')),
    copyFile(
      path.resolve(projRoot, 'README.md'),
      path.resolve(epOutput, 'README.md')
    ),
    copyFile(
      path.resolve(projRoot, 'typings', 'global.d.ts'),
      path.resolve(epOutput, 'global.d.ts')
    ),
  ])

这里复制了三个文件

packages/element-plus/package.json

packages/element-plus/package.json这个文件复制到打包后的项目下当作打包后的package.json

package.json里面涉及了一些package.json的基础信息,例如:

json 复制代码
{
  "name": "element-plus",        // 包名,安装时使用 npm install element-plus
  "version": "0.0.0-dev.1",     // 版本号
  "description": "A Component Library for Vue 3", // 包的描述
  "keywords": ["element-plus", "vue", ...], // 关键词,方便 npm 搜索
  "homepage": "https://element-plus.org/", // 官网地址
  "bugs": { "url": "..." },      // 问题反馈地址
  "license": "MIT",              // 开源协议
  "repository": { ... }         // 代码仓库地址
  "publishConfig": { ... }    // 发布配置:`access: public` 表示该包是公开发布的(npm 私有包需付费,此配置确保包公开可访问)
}

还有一些模块导出规则的信息,main/module/types这三个是早期 npm 包的 "基础配置",只能定义 "根路径" 的单一入口,无法精细化控制子路径,现在的exports优先级更高

json 复制代码
"main": "lib/index.js",
"module": "es/index.mjs",
"types": "es/index.d.ts",
perl 复制代码
"exports": {
  // 1. 根路径引入:import 'element-plus' / require('element-plus')
  ".": {
    "types": "./es/index.d.ts",  // TS 类型文件(优先匹配)
    "import": "./es/index.mjs",  // ESM 引入(import 语法)加载 es 目录的 mjs 文件(ESM 模块)
    "require": "./lib/index.js"  // CommonJS 引入(require 语法)加载 lib 目录的 js 文件(CJS 模块)
  },
  // 2. 全局类型引入:import 'element-plus/global'
  "./global": {
    "types": "./global.d.ts"     // 仅导出全局类型(无 js 代码,用于全局类型声明)
  },
  // 3. 直接引入 es 目录:import 'element-plus/es'
  "./es": {
    "types": "./es/index.d.ts",
    "import": "./es/index.mjs"   // 仅支持 ESM 引入(es 目录只存 ESM 模块)
  },
  // 4. 直接引入 lib 目录:require('element-plus/lib')
  "./lib": {
    "types": "./lib/index.d.ts",
    "require": "./lib/index.js"  // 仅支持 CommonJS 引入(lib 目录只存 CJS 模块)
  },
  // 5. 按需引入 es 目录下的 mjs 文件:import 'element-plus/es/button.mjs'
  "./es/*.mjs": {
    "types": "./es/*.d.ts",      // 匹配对应 ts 类型文件(如 button.d.ts)
    "import": "./es/*.mjs"       // 加载对应 mjs 文件(ESM 按需引入)
  },
  // 6. 按需引入 es 目录下的模块:import 'element-plus/es/button'(无后缀)
  "./es/*": {
    "types": ["./es/*.d.ts", "./es/*/index.d.ts"], // 类型匹配优先级:先找 button.d.ts,再找 button/index.d.ts
    "import": "./es/*.mjs"       // 自动补全 mjs 后缀,适配开发者省略后缀的习惯
  },
  // 7. 按需引入 lib 目录下的 js 文件:require('element-plus/lib/button.js')
  "./lib/*.js": {
    "types": "./lib/*.d.ts",
    "require": "./lib/*.js"      // CJS 按需引入(带后缀)
  },
  // 8. 按需引入 lib 目录下的模块:require('element-plus/lib/button')(无后缀)
  "./lib/*": {
    "types": ["./lib/*.d.ts", "./lib/*/index.d.ts"], // 类型匹配规则同 es 目录
    "require": "./lib/*.js"      // 自动补全 js 后缀
  },
  // 9. 兜底规则:匹配所有未定义的路径(如 import 'element-plus/package.json')
  "./*": "./*"
}

package.json中还有相关的peerDependencies(要求项目中安装符合版本的依赖,否则会进行提醒)、dependencies、devDependencies

还有其他的相关配置可自行查看文档

README.md

根路径下的README文档,复制到打包后的包中

global.d.ts

这个文件就是Element Plus 的全局 TypeScript 类型声明文件

主要就是全局引入组件的时候,方便通过引入这个类型文件,在整个项目中都有提示

可见文档说明 ElementPlus快速开始

相关推荐
程序员黑豆6 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
To_OC7 小时前
踩了个 TS 的坑之后,我终于把 type 和 interface 掰明白了
前端·react.js·typescript
GreenTea7 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
浮生望7 小时前
前端API工程化:用 Mock 数据与 Axios 配置实现独立于后端的并行开发
前端
万少8 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
波波0078 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
Brown.alexis9 小时前
es6知识点1-自备使用
前端·ecmascript·es6
小爬的老粉丝10 小时前
JavaScript 纯前端预览 WPS:先识别容器,再路由解析器
前端·javascript·wps
计算机魔术师10 小时前
新兴多智能体系统的模式与问题
前端
用户0595401744611 小时前
AI Agent 上下文污染踩坑实录:用 pytest + Redis 揪出 3 类记忆串号 bug,排查 6 小时
前端·css