@feature-sliced/filesystem

中文文档
3.1.1发布于 2026/08/26ISCTypeScriptESM + CJS近 30 天下载 73.1万

一套用于查找文件系统中的FSD根并与之合作的公用设备.

中文使用文档
文档目录5 节
  1. 安装
  2. API 密码
  3. resolveImport
  4. layerSequence , (中文(简体) ), unslicedLayers ,以及 conventionalS…
  5. FSD - 意识向上

@ feature- sliced/ 文件系统

npm version minzipped package size

一套用于查找文件系统中的FSD根并与之合作的公用设备.

该项目旨在开发工具,用于 特色设计。 。 。 .

安装

pnpm add @feature-sliced/filesystem
npm install --save @feature-sliced/filesystem

类型定义构建于QQ.

API 密码

resolveImport

function resolveImport(
  importedPath: string,
  importerPath: string,
  tsCompilerOptions: typescript.CompilerOptions,
  fileExists: (path: string) => boolean,
  directoryExists?: (path: string) => boolean,
): string | null;

给出文件名、 导入路径和 TSConfig 对象, 生成导入文件的路径, 相对于 TypeScript 的路径 baseUrl。 。 。 .

示例

// /project/src/pages/home/ui/HomePage.tsx
import { Button } from "~/shared/ui";
// ./tsconfig.json
{
  "compilerOptions": {
    "moduleResolution": "Bundler",
    "baseUrl": ".",
    "paths": {
      "~/*": ["./src/*"]
    }
  }
}
resolveImport(
  "~/shared/ui",
  "./src/pages/home/ui/HomePage.tsx",
  { moduleResolution: "Bundler", baseUrl: ".", paths: { "~/*": ["./src/*"] } },
  fs.existsSync,
);

预期产出: /project/src/shared/ui/index.ts。 。 。 .

layerSequence, (中文(简体) ), unslicedLayers,以及 conventionalSegmentNames

FSD中重要名称的定义.

export const layerSequence: Array<LayerName> = [
  "shared",
  "entities",
  "features",
  "widgets",
  "pages",
  "app",
];
export const unslicedLayers = ["shared", "app"];
export const conventionalSegmentNames = ["ui", "api", "lib", "model", "config"];

FSD - 意识向上

简单表示文件系统的一组倒转函数 :

export interface File {
  type: "file";
  path: string;
}

export interface Folder {
  type: "folder";
  path: string;
  children: Array<File | Folder>;
}

所有倒转函数在层文件夹上识别前缀(下划线或数字后加下划线等). _app 或者说 6_shared) (中文(简体) ). 图层名称总是在没有前缀的情况下报告,而返回的则 Folder 对象保留物理、前缀路径.

getLayers

export type LayerName =
  | "shared"
  | "entities"
  | "features"
  | "widgets"
  | "pages"
  | "app";

function getLayers(fsdRoot: Folder): Partial<Record<LayerName, Folder>>;

从 FSD 根中提取层 。 返回图层名称映射到文件夹对象。 前缀地层( 如. 6_shared, (中文(简体) ), _app) 被绘制到其冠名上(shared, (中文(简体) ), app) (中文(简体) ). 当同一层的前缀和非前缀的变体同时存在时,前缀的一取胜.

getSlices

function getSlices(
  slicedLayer: Folder,
  additionalSegmentNames: Array<string> = [],
): Record<string, Folder>;

从 a 提取切片 切开 层。 返回切片名称映射( 可能包含斜线) 到文件夹对象 .

当文件夹至少有一个文件夹/文件并有常规片段的名称时, 就会被检测为切片(ui, (中文(简体) ), api, (中文(简体) ), model, (中文(简体) ), lib, (中文(简体) ), config) (中文(简体) ). 如果您的工程包含没有这些片段的片段,您可以提供额外的片段名称.

getSegments

function getSegments(
  sliceOrUnslicedLayer: Folder,
): Record<string, Folder | File>;

从切片或切片取出片段 未切开 层。 将分区名称映射到文件夹或文件对象.

getAllSlices

function getAllSlices(
  fsdRoot: Folder,
  additionalSegmentNames: Array<string> = [],
): Record<string, Folder & { layerName: string }>;

从 FSD 根的所有层提取切片 。 返回切片名称映射到文件夹对象( 可能包含斜线), 并加增 layerName 属性。 这个 layerName 是条形(前缀-已勾接)层名.

当文件夹至少有一个文件夹/文件并有常规片段的名称时, 就会被检测为切片(ui, (中文(简体) ), api, (中文(简体) ), model, (中文(简体) ), lib, (中文(简体) ), config) (中文(简体) ). 如果您的工程包含没有这些片段的片段,您可以提供额外的片段名称.

getAllSegments

function getAllSegments(fsdRoot: Folder): Array<{
  segment: Folder | File;
  segmentName: string;
  sliceName: string | null;
  layerName: LayerName;
}>;

从 FSD 根的所有切片和分层中提取段 。 在 FSD 根( 层, 切片) 中返回一个平整的段数组及其名称和位置 .

isSliced

[注]
不要和他们混淆 isSlice,这个函数根据文件夹包含的片段来决定文件夹是否像切片.

export type LayerName =
  | "shared"
  | "entities"
  | "features"
  | "widgets"
  | "pages"
  | "app";

function isSliced(layerOrName: Folder | LayerName): boolean;

确定此层是否被切开 。 您可以通过一层的文件夹或名称( 小写) 。 只有共享层和App层没有被切片,其余部分是.

getIndexes

function getIndexes(fileOrFolder: File | Folder): File[];

获取切片或片段的索引(公共 API) 。 当一个片段是一个文件时,它是它自己的索引. 当一个片段是文件夹时,它会返回该文件夹内的一系列索引文件. 多个索引文件(例如, index.client.js, (中文(简体) ), index.server.js) 得到支持.

isIndex

function isIndex(fileOrFolder: File | Folder): boolean;

确定一个给定的文件或文件夹是否是一个索引文件(只有文件可以成为索引,为方便而接受文件夹,但总是返回虚假).

isSlice

[注]
不要和他们混淆 isSliced,该函数根据 FSD 确定一个层是否包含切片.

function isSlice(
  folder: Folder,
  additionalSegmentNames: Array<string> = [],
): boolean;

确定此文件夹是否为切片 .

剪切被定义为包含至少一个部分的文件夹. 如果项目中的某些片段仅包含非常规片段,则可以提供额外的片段名称.

isCrossImportPublicApi

function isCrossImportPublicApi(
  file: File,
  {
    inSlice,
    forSlice,
    layerPath,
  }: { inSlice: string; forSlice: string; layerPath: string },
): boolean;

检查某个文件是否是切片中定义的交叉导入公共 API inSlice 切片时 forSlice 在某一层.

例如:

const file = { path: "./src/entities/user/@x/product.ts", type: "file" };
isCrossImportPublicApi(file, {
  inSlice: "user",
  forSlice: "product",
  layerPath: "./src/entities",
}); // true

版本与发布记录

@feature-sliced/filesystem 共发布 16 个版本,首次发布于 2024/01/25;过去 12 个月发布了 2 个版本。

版本发布日期距今
3.1.1latest2026/08/262 个月前
3.1.02026/04/176 个月前
3.0.12025/04/191.6 年前
3.0.02025/03/191.7 年前
2.4.02024/10/022 年前
2.3.02024/09/282 年前

关于 @feature-sliced/filesystem 的常见问题

@feature-sliced/filesystem 是什么?

一套用于查找文件系统中的FSD根并与之合作的公用设备.

如何安装 @feature-sliced/filesystem?

在项目目录运行 npm install @feature-sliced/filesystem,或使用 pnpm add / yarn add / bun add。

@feature-sliced/filesystem 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@feature-sliced/filesystem 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@feature-sliced/filesystem 可以商用吗?

@feature-sliced/filesystem 使用 ISC 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@feature-sliced/filesystem 的下载量有多少?

根据 npm 官方下载统计,@feature-sliced/filesystem 在 2026/10/15 – 2026/11/13 这 30 天内被下载 731,075 次,日均约 24,369 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@feature-sliced/filesystem 还在维护吗?

最新版本 3.1.1 发布于 2026/08/26(2 个月前);至今共发布 16 个版本,其中过去 12 个月发布了 2 个;首次发布于 2024/01/25。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。