alibaba / rax

🐰 Rax is a progressive framework for building universal application. https://rax.js.org
Other
7.99k stars 627 forks source link

[Discussion] Rax Core result format #2217

Closed SoloJiang closed 3 years ago

SoloJiang commented 3 years ago

背景

目前 rax 核心包会导出多种格式文件,但实际使用到的比较少,同时由于 rollup 版本升级导致原先 dist/rax.js IIFE 格式的导出形式和之前存在差异,不能直接在 cjs 的模块系统中使用(可在构建结束添加导出代码,以前也是通过添加导出代码 run 起来的)。

当下打出的产物如下:

- dist
  - rax.js
  - rax.min.js
  - rax.umd.js
  - rax.umd.js 
  - rax.mjs.js
- lib (多文件)
- es(多文件、esm 导出规范)

lib 和 es 目录是通过 babel 单文件编译的。

同时 rax core 的入口文件为根目录下 index.js:

if (process.env.NODE_ENV === 'production') {
  module.exports = require('./dist/rax.min.js');
} else {
  module.exports = require('./lib/index.js');
}

同时,dist/rax.min.jslib/index.js 是否是 esmodule 导出的标识也是不一样的(前者没有),这会导致某些构建场景下存在不一致性,导致报错。

React 是怎么做的

目前 React 没有多文件导出形式,全部都是编译成单文件,同时提供两种格式的产物,分别是 cjs 和 umd,发到 cdn 上的版本是 umd,通过 npm 引用的形式是 cjs:https://unpkg.com/browse/react@17.0.2/

入口文件为:

'use strict';

if (process.env.NODE_ENV === 'production') {
  module.exports = require('./cjs/react.production.min.js');
} else {
  module.exports = require('./cjs/react.development.js');
}

即统一使用 cjs 的形式。

后续变更方案(待讨论)

index.js 中导出 cjs 产物:

'use strict';

if (process.env.NODE_ENV === 'production') {
  module.exports = require('./lib/rax.min.js');
} else {
  module.exports = require('./lib/rax.js');
}

cdnjs 上同时上传 lib/es/dist 目录(需要给 cdnjs/packages 提 PR)

SoloJiang commented 3 years ago
SoloJiang commented 3 years ago
imsobear commented 3 years ago

单文件的话全部放在 dist 目录下是不是更好?

imsobear commented 3 years ago

「或者直接把抽离的 API 再合入 rax core(会导致 core 体积变大)」大多少,之前有聊过把这块直接放到 core 里,不强行分开了

SoloJiang commented 3 years ago

全部放在 dist 目录下可能存在的问题: compat 文件现在的 alias 是这么做的: alias: rax => rax/lib/compat 可能会有 break

SoloJiang commented 3 years ago

「或者直接把抽离的 API 再合入 rax core(会导致 core 体积变大)」大多少,之前有聊过把这块直接放到 core 里,不强行分开了

gzipped 之后 1kb 左右

SoloJiang commented 3 years ago

最终结论:

SoloJiang commented 3 years ago

2219