Esmx 是一个基于 Rspack 的高性能 Web 应用框架,提供了完整的应用生命周期管理、静态资源处理和服务端渲染能力。
type BuildEnvironment = 'client' | 'server'应用程序运行时环境类型:
client: 运行在浏览器环境,支持 DOM 操作和浏览器 APIserver: 运行在 Node.js 环境,支持文件系统和服务器端功能type ImportMap = {
imports?: SpecifierMap
scopes?: ScopesMap
}ES 模块导入映射类型。
type SpecifierMap = Record<string, string>模块标识符映射类型,用于定义模块导入路径的映射关系。
type ScopesMap = Record<string, SpecifierMap>作用域映射类型,用于定义特定作用域下的模块导入映射关系。
enum COMMAND {
dev = 'dev',
build = 'build',
preview = 'preview',
start = 'start'
}命令类型枚举:
dev: 开发环境命令,启动开发服务器并支持热更新build: 构建命令,生成生产环境的构建产物preview: 预览命令,启动本地预览服务器start: 启动命令,运行生产环境服务器定义 Esmx 框架的核心配置选项。
interface EsmxOptions {
root?: string
isProd?: boolean
basePathPlaceholder?: string | false
modules?: ModuleConfig
packs?: PackConfig
devApp?: (esmx: Esmx) => Promise<App>
server?: (esmx: Esmx) => Promise<void>
postBuild?: (esmx: Esmx) => Promise<void>
}stringprocess.cwd()项目根目录路径。可以是绝对路径或相对路径,相对路径基于当前工作目录解析。
booleanprocess.env.NODE_ENV === 'production'环境标识。
true: 生产环境false: 开发环境string | false'[[[___ESMX_DYNAMIC_BASE___]]]'基础路径占位符配置。用于运行时动态替换资源的基础路径。设置为 false 可以禁用此功能。
ModuleConfig模块配置选项。用于配置项目的模块解析规则,包括模块别名、外部依赖等配置。
PackConfig打包配置选项。用于将构建产物打包成标准的 npm .tgz 格式软件包。
(esmx: Esmx) => Promise<App>开发环境应用创建函数。仅在开发环境中使用,用于创建开发服务器的应用实例。
export default {
async devApp(esmx) {
return import('@esmx/rspack').then((m) =>
m.createRspackHtmlApp(esmx, {
config(context) {}
})
)
}
}(esmx: Esmx) => Promise<void>服务器启动配置函数。用于配置和启动 HTTP 服务器,在开发环境和生产环境中都可使用。
export default {
async server(esmx) {
const server = http.createServer((req, res) => {
esmx.middleware(req, res, async () => {
const render = await esmx.render({
params: { url: req.url }
});
res.end(render.html);
});
});
server.listen(3000);
}
}(esmx: Esmx) => Promise<void>构建后置处理函数。在项目构建完成后执行,可用于:
stringtrue当前模块的名称,来源于模块配置。
stringtrue基于模块名生成的合法 JavaScript 变量名。
stringtrue项目根目录的绝对路径。如果配置的 root 为相对路径,则基于当前工作目录解析。
booleantrue判断当前是否为生产环境。优先使用配置项中的 isProd,若未配置则根据 process.env.NODE_ENV 判断。
stringtrueNotReadyError - 框架未初始化时获取以斜杠开头和结尾的模块基础路径。返回格式为 /${name}/,其中 name 来自模块配置。
stringtrue获取用于运行时动态替换的基础路径占位符。可通过配置禁用。
Middlewaretrue获取静态资源处理中间件。根据环境提供不同实现:
const server = http.createServer((req, res) => {
esmx.middleware(req, res, async () => {
const rc = await esmx.render({ url: req.url });
res.end(rc.html);
});
});(options?: RenderContextOptions) => Promise<RenderContext>true获取服务端渲染函数。根据环境提供不同实现:
const rc = await esmx.render({
params: { url: req.url }
});
const rc = await esmx.render({
base: '',
importmapMode: 'inline',
entryName: 'default',
params: {
url: req.url,
state: { user: 'admin' }
}
});typeof COMMANDtrue获取命令枚举类型定义。
ParsedModuleConfigtrueNotReadyError - 框架未初始化时获取当前模块的完整配置信息,包括模块解析规则、别名配置等。
ParsedPackConfigtrueNotReadyError - 框架未初始化时获取当前模块的打包相关配置,包括输出路径、package.json 处理等。
options?: EsmxOptions - 框架配置选项Esmx创建 Esmx 框架实例。
const esmx = new Esmx({
root: './src',
isProd: process.env.NODE_ENV === 'production'
});command: COMMANDPromise<boolean>Error: 重复初始化时NotReadyError: 访问未初始化实例时初始化 Esmx 框架实例。执行以下核心初始化流程:
NotReadyErrorconst esmx = new Esmx({
root: './src',
isProd: process.env.NODE_ENV === 'production'
});
await esmx.init(COMMAND.dev);Promise<boolean>销毁 Esmx 框架实例,执行资源清理和连接关闭等操作。主要用于:
process.once('SIGTERM', async () => {
await esmx.destroy();
process.exit(0);
});Promise<boolean>执行应用程序的构建流程,包括:
在框架实例未初始化时调用会抛出 NotReadyError
export default {
async postBuild(esmx) {
await esmx.build();
const render = await esmx.render({
params: { url: '/' }
});
esmx.writeSync(
esmx.resolvePath('dist/client', 'index.html'),
render.html
);
}
}Promise<void>NotReadyError - 框架未初始化时启动 HTTP 服务器和配置服务器实例。在以下生命周期中被调用:
export default {
async server(esmx) {
const server = http.createServer((req, res) => {
esmx.middleware(req, res, async () => {
const render = await esmx.render({
params: { url: req.url }
});
res.end(render.html);
});
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000');
});
}
}Promise<boolean>执行构建后的处理逻辑,用于:
export default {
async postBuild(esmx) {
const pages = ['/', '/about', '/404'];
for (const url of pages) {
const render = await esmx.render({
params: { url }
});
await esmx.write(
esmx.resolvePath('dist/client', url.substring(1), 'index.html'),
render.html
);
}
}
}解析项目路径,将相对路径转换为绝对路径。
参数:
projectPath: ProjectPath - 项目路径类型...args: string[] - 路径片段返回值: string - 解析后的绝对路径
示例:
const htmlPath = esmx.resolvePath('dist/client', 'index.html');同步写入文件内容。
参数:
filepath: string - 文件的绝对路径data: any - 要写入的数据,可以是字符串、Buffer 或对象返回值: boolean - 写入是否成功
示例:
async postBuild(esmx) {
const htmlPath = esmx.resolvePath('dist/client', 'index.html');
const success = esmx.writeSync(htmlPath, '<html>...</html>');
}同步读取并解析 JSON 文件。
参数:
filename: string - JSON 文件的绝对路径返回值: any - 解析后的 JSON 对象
异常: 当文件不存在或 JSON 格式错误时抛出异常
示例:
async server(esmx) {
const manifest = esmx.readJsonSync(esmx.resolvePath('dist/client', 'manifest.json'));
}异步读取并解析 JSON 文件。
参数:
filename: string - JSON 文件的绝对路径返回值: Promise<any> - 解析后的 JSON 对象
异常: 当文件不存在或 JSON 格式错误时抛出异常
示例:
async server(esmx) {
const manifest = await esmx.readJson(esmx.resolvePath('dist/client', 'manifest.json'));
}获取构建清单列表。
参数:
target: BuildEnvironment - 目标环境类型
'client': 客户端环境'server': 服务端环境返回值: Promise<readonly ManifestJson[]> - 只读的构建清单列表
异常: 在框架实例未初始化时抛出 NotReadyError
该方法用于获取指定目标环境的构建清单列表,包含以下功能:
缓存管理
环境适配
模块映射
async server(esmx) {
const manifests = await esmx.getManifestList('client');
const appModule = manifests.find(m => m.name === 'my-app');
if (appModule) {
console.log('App exports:', appModule.exports);
console.log('App chunks:', appModule.chunks);
}
}获取导入映射对象。
参数:
target: BuildEnvironment - 目标环境类型
'client': 生成浏览器环境的导入映射'server': 生成服务端环境的导入映射返回值: Promise<Readonly<ImportMap>> - 只读的导入映射对象
异常: 在框架实例未初始化时抛出 NotReadyError
该方法用于生成 ES 模块导入映射(Import Map),具有以下特点:
模块解析
缓存优化
路径处理
async server(esmx) {
const importmap = await esmx.getImportMap('client');
const html = `
<!DOCTYPE html>
<html>
<head>
<script type="importmap">
${JSON.stringify(importmap)}
</script>
</head>
<body>
</body>
</html>
`;
}获取客户端导入映射信息。
参数:
mode: ImportmapMode - 导入映射模式
'inline': 内联模式,返回 HTML script 标签'js': JS 文件模式,返回带有文件路径的信息返回值:
{
src: string;
filepath: string;
code: string;
}{
src: null;
filepath: null;
code: string;
}异常: 在框架实例未初始化时抛出 NotReadyError
该方法用于生成客户端环境的导入映射代码,支持两种模式:
内联模式 (inline)
JS 文件模式 (js)
核心功能:
自动处理动态基础路径
支持模块路径运行时替换
优化缓存策略
确保模块加载顺序
示例:
async server(esmx) {
const server = express();
server.use(esmx.middleware);
server.get('*', async (req, res) => {
const result = await esmx.render({
importmapMode: 'js',
params: { url: req.url }
});
res.send(result.html);
});
server.get('/inline', async (req, res) => {
const result = await esmx.render({
importmapMode: 'inline',
params: { url: req.url }
});
res.send(result.html);
});
}获取模块的静态导入路径列表。
参数:
target: BuildEnvironment - 构建目标
'client': 客户端环境'server': 服务端环境specifier: string - 模块标识符返回值: Promise<readonly string[] | null> - 返回静态导入路径列表,如果未找到则返回 null
异常: 在框架实例未初始化时抛出 NotReadyError
示例:
const paths = await esmx.getStaticImportPaths(
'client',
`your-app-name/src/entry.client`
);