模块的导入和导出在实际开发中代码不会都写在一个文件里。如果所有代码都堆在一起后续想修改某个功能、找某个逻辑简直就是大海捞针因此在实际开发中通常会将代码拆分成多个文件这样管理和维护起来更加方便。模块是代码拆分、复用与隔离的核心机制一将复杂项目按功能业务拆分成多个独立文件每个文件就是一个模块通过 export 暴露模块内的接口、类、函数再通过 import 在其他模块中导入使用。在 ArkTS 中一个文件就是一个模块不同文件之间的代码是隔离的。通俗地讲在 A 文件中写的函数、类、变量在 B 文件里是无法直接使用的。编译器会报错提示“找不到内容”。这里在 Device 文件中定义了 Device 类在 Light 文件定义了 Light 类并且想要继承 Device 类。但编译器中却提示找不到 Device 类的错误因为两个文件的作用域是分开的互相不认识。// Device 文件 class Device { name: string ; constructor(name: string) { this.name name; } } // Light 文件 // 找不到名称Device class Light extends Device { name: string 灯; protected status: string off; turnOn(): void { this.status on; } }这里可以通过 export 和 import 关键字实现在 Light 文件中使用 Device 文件的代码。// Device 文件 export class Device { name: string ; constructor(name: string) { this.name name; } } // Light 文件 import { Device } from ./Device; class Light extends Device { name: string 灯; protected status: string off; turnOn(): void { this.status on; } }命名导入与导出直接在成员声明前加 export可导出多个成员导入时需用同名接收。// /module/Light文件 // 导出类灯光类 export class Light extends Device { name: string 客厅灯; } // 导出常量默认亮度 export const DEFAULT_BRIGHTNESS 50; // 导出函数创建默认配置的灯 export function createDefaultLight(name: string): Light { return new Light(name); } // 导出接口设备配置结构 export interface LightConfig { name: string; }导入命名导出的成员用 import{成员名 1, 成员名 2, …} from “模块路径”,成员名必须和导出时一致可以通过 as 重命名。// Test 文件 import { Light, createDefaultLight, DEFAULT_BRIGHTNESS, LightConfig as Config } from ../module/Light; let lightConfig: Config { name: , maxBrightness: DEFAULT_BRIGHTNESS } createDefaultLight(light);默认导出与导入一个模块只能有一个默认导出使用 export default 声明。导入时可以自定义名称无需与导出名称一致。默认导出适合模块的核心功能例如模块只暴露一个类。// /module/Light 文件 export default class Light extends Device { name: string 客厅灯; protected _status: string off; turnOn(): void { this._status on; } }导入默认导出的成员用 import 自定义名称 from “模块路径”名称可自定义无需和导出时一致。// Test 文件 import LightClass from ../module/Light’; let light new LightClass(客厅灯);动态导入动态导入是 ArkTS 中用于按需加载模块的核心机制会返回 Promise 对象并以异步方式实现模块的条件加载和运行时解耦适用于性能优化和复杂业务场景。例如有时导入的模块太大直接使用静态导入会让代码加载速度变慢。如果要导入的模块一开始不存在需要等待一段时间例如需要从网路上获取。这时就可以动态导入。动态导入的好处是按需加载或者根据条件加载可以提升加载速度让应用更加流畅。import(../module/Light) .then((lightImport) { lightImport.createDefaultLight(light); console.log(${lightImport.DEFAULT_BRIGHTNESS}); }) .catch((error: BusinessError) { console.error(error ${error.code} ${error.message}); });命名空间的概念和使用命名空间是通过 namespace 关键字定义的代码逻辑边界用于将相关类、接口、函数等组织在一起避免命名冲突并提高代码可维护性。namespace命名空间名称{export接口、变量、函数、类}namespace DeviceControl { // 导出类 export class Device { name: string ; } // 导出接口设备配置结构 export interface LightConfig { name: string; maxBrightness: number; } // 导出函数创建默认配置的灯 export function createDevice(): Device { return new Device(); } // 导出常量默认亮度 export const DEFAULT_BRIGHTNESS 50; }可以通过命名空间.成员名访问导出内容。// /module/DeviceNamespace文件 export namespace DeviceControl { // 导出类 export class Device { name: string ; } // 导出接口设备配置结构 export interface LightConfig { name: string; } // 导出函数创建默认配置的灯 export function createDevice(): Device { return new Device(); } // 导出常量默认亮度 export const DEFAULT_BRIGHTNESS 50; }// Test文件 import { DeviceControl } from ../module/DeviceNamespace; let device new DeviceControl.Device(light); let lightConfig: DeviceControl.LightConfig { name: , maxBrightness: DeviceControl.DEFAULT_BRIGHTNESS } let airConditioner DeviceControl.createDevice(airConditioner);
郑州网站建设
网页设计
企业官网