返回

深入剖析ElementUI源码系列四:破解new.js文件自动构建组件目录结构与components.json奥秘

前端







**初识new.js文件** 

new.js文件位于ElementUI源码的build目录下,它是ElementUI构建过程中的一个重要脚本文件。该文件负责创建组件目录结构并生成components.json文件内容。

**自动创建组件目录结构** 

new.js文件首先会读取ElementUI源码目录下的src/components文件夹,然后将该文件夹下的所有组件目录名提取出来,并按照一定规则生成新的组件目录结构。

const fs = require('fs');
const path = require('path');

// 读取src/components文件夹下的所有组件目录名
const componentDirs = fs.readdirSync(path.resolve(__dirname, '../src/components'));

// 按照一定规则生成新的组件目录结构
for (let i = 0; i < componentDirs.length; i++) {
const componentDir = componentDirs[i];
const newComponentDir = path.resolve(__dirname, '../lib/components', componentDir);

// 如果新组件目录不存在,则创建它
if (!fs.existsSync(newComponentDir)) {
fs.mkdirSync(newComponentDir);
}
}


**生成components.json文件内容** 

new.js文件接下来会遍历src/components文件夹下的所有组件目录,并为每个组件目录生成一个对应的components.json文件。components.json文件包含了该组件目录下所有组件的信息,包括组件名称、组件路径、组件依赖等。

// 遍历src/components文件夹下的所有组件目录
for (let i = 0; i < componentDirs.length; i++) {
const componentDir = componentDirs[i];

// 生成components.json文件内容
const componentsJson = {
name: componentDir,
components: [],
dependencies: []
};

// 读取组件目录下的所有组件文件
const componentFiles = fs.readdirSync(path.resolve(__dirname, '../src/components', componentDir));

// 遍历组件文件,提取组件名称、组件路径、组件依赖等信息
for (let j = 0; j < componentFiles.length; j++) {
const componentFile = componentFiles[j];
const componentName = path.basename(componentFile, '.vue');
const componentPath = path.resolve(__dirname, '../src/components', componentDir, componentFile);

// 提取组件依赖
const componentDependencies = [];

// 将组件信息添加到componentsJson对象中
componentsJson.components.push({
  name: componentName,
  path: componentPath,
  dependencies: componentDependencies
});

}

// 将componentsJson对象写入components.json文件
fs.writeFileSync(path.resolve(__dirname, '../lib/components', componentDir, 'components.json'), JSON.stringify(componentsJson, null, 2));
}


**结语** 

通过对new.js文件的剖析,我们了解了ElementUI如何自动创建组件目录结构并生成components.json文件内容的奥秘。这为我们学习ElementUI源码、开发自己的组件库提供了宝贵的经验和借鉴。