6.2.1 • Published 2 months ago

@reskript/cli-build v6.2.1

Weekly downloads
270
License
MIT
Repository
-
Last release
2 months ago

@reskript/cli-build

用于使用webpack构建应用。

基础目录结构

构建系统对目录结构有一定要求,必须包含以下部分:

/src
    /styles
        *.global.less # .global.less文件不会经过CSS Modules编译,可放置一些全局的样式
        *.var.less # .var.less会被提取作为LESS编译时的变量,内部仅可声明变量(以及注释)
    /entries
        index.js # 主入口
reskript.config.js # 系统配置文件

其中*.global.less事实上可以放置在任意位置,只要是以.global.less结尾的,均不会经过CSS Modules处理。

正常使用

默认情况下,你可以在项目结构符合约束的情况下,直接进行构建:

Usage: build [options]

Build entire app

Options:
  --cwd [value]           override current working directory (default: process.cwd())
  --mode [value]          set build mode, default to "production" (default: "production")
  --src-dir [value]       specify the dir containing source files relative to cwd (default: "src")
  --build-target [value]  create index.html according to specific target
  --feature-only [value]  build named feature only, ignore other features
  --analyze               enable bundle analytics
  --profile               enable react profiling mode
  --clean                 remove dist directory before build
  -h, --help              output usage information

默认基于Feature Matrix构建,需要线上的Nginx等服务器配合分流。如果没有这一能力,则需要指定--build-target参数,该参数指定的Feature集合的构建结果会被复制为index.html,以便上线部署时不会出错。

你可以使用--feature-only参数指定只构建一个Feature集合,但此时构建产生的HTML依然是index-xxx.html,可以与--build-target共用来生成index.html

构建产物

构建输出到dist目录,所有静态资源放置于dist/assets目录下,入口HTML页面放置于dist目录下。基于Feature Matrix进行构建后,不同Feature集产生的文件也都混合在一起,无需分隔为不同目录。

在Feature Matrix的模式下,线上分流需要按照HTML文件名分流,如主流量分到stable.html上,小流量则分到insiders.html上。而dist/assets目录则不需要设置鉴权,以便Sentry或Firefox等应用在无Cookie的情况下可以成功下载到Source Map。

如果当前系统线上无法基于HTML文件名分流,则参考“启动构建”章节使用--build-target参数进行兼容。

系统配置

对于应用,在项目的根目录下的reskript.config.js中可以有featureMatrixbuildplugins导出控制构建。

Feature Matrix

reskript.config.js导出featureMatrix对象,该对象的每一个属性均代表一个Feature集合。

通常推荐应用包含以下3个Feature集合:

  • stable:用于全流量。
  • insiders:用于小流量。
  • dev:用于开发。

其中dev仅在开发过程使用。如果系统本身没有灰度机制,可以使用最简单的模板:

exports.featureMatrix = {
    stable: {},
    insiders: {},
    dev: {}
};

构建配置

reskript.config.js导出builld对象,可以包含以下属性:

interface BuildStyleSettings {
    // 是否将CSS抽取到独立的.css文件中,默认为false,打开这个配置可能导致CSS顺序有问题
    extract: boolean;
    // 用于编译LESS的变量资源文件列表。每个文件均会被注入到所有的LESS文件前面,作为全局可用的资源
    resources: string[];
    // 额外的LESS变量,以对象的形式提供,用于less的modifyVars配置
    lessVariables: Record<string, string>;
    // 启用CSS Modules,默认为true。为true对非第三方代码启用,为false则全面禁用,为函数则通过文件路径自主判断
    modules: boolean | ((resoruce: string) => boolean);
}

interface BuildScriptSettings {
    // 经过babel处理的文件,默认为true。为true对非第三方代码启用,为false则全面禁用,为函数则通过文件路径自主判断
    readonly babel: boolean | ((resoruce: string) => boolean);
    // 是否自动引入core-js的相应polyfill,默认为true。如果你使用了其它方式引入polyfill,设置为false即可
    readonly polyfill: boolean;
    // 最终手动处理babel配置
    readonly finalize: (babelConfig: TransformOptions, env: BuildEntry) => TransformOptions;
    // 是否启用默认的import优化,主要是对`antd`和`lodash`进行优化。如果要从CDN走这些包,关掉这个配置自己折腾
    defaultImportOptimization: boolean;
}

interface BuildSettings {
    // 是否以第三方库的形式构建,第三方库的构建不使用featureMatrix、不拆分chunk,同时构建产出不带hash、不产出HTML文件
    readonly thirdParty: boolean;
    // 构建过程中检查代码规范,默认值为true。如无特殊原因,禁止关闭这个开关
    readonly reportLintErrors: boolean;
    // 生成静态文件的限值,以字节为单位。小于该值的会被编译为DataURI内联,大于该值的会变为单独的文件。默认值为8KB
    readonly largeAssetSize: number;
    // 应用的标题,用于生成<title>元素
    readonly appTitle: string;
    // favicon的位置
    readonly favicon?: string;
    // 构建过程中需要排除的Feature名称,默认排除'dev',其它均会被构建
    readonly excludeFeatures: string[];
    readonly style: BuildStyleSettings;
    readonly script: BuildScriptSettings;
    // 最终手动处理webpack配置
    readonly finalize: (webpackConfig: WebpackConfiguration, env: BuildEntry) => WebpackConfiguration;
}

使用插件

reskript.config.js导出plugins数组,数组中的每一项为一个函数,函数接受reskript.config.js导出的{featureMatrix, build, devServer, final}对象和当前命令行参数,并返回一个相同的对象。

插件会按顺序被依次调用,最终返回的对象用于各种功能。

代码约定

入口页配置

构建或调试允许定制入口页,也允许单系统多入口。

系统必须有src/entries这个目录,其下放置所有的入口文件,默认的名称为index。每一个入口对应以下文件:

  • [name].js:入口的启动脚本。
  • [name].ejs:HTML模板,以EJS作为模板格式,如果一个入口不存在对应的.ejs文件,则会使用默认的模板。自定义模板可使用htmlWebpackPlugin.options.buildIdentifier获取构建版本号。
  • [name].config.js:生成入口页面的额外配置,这个文件的module.exports对象会直接传递给html-webpack-plugin,可以定制化页面信息,也可以将额外的数据传递给[name].ejs模板。

例如某个入口页面的<title>希望得到修改,则可以在[name].config.js中这样写:

module.exports = {
    title: '定制化的标题'
};

入口页的模板([name].ejs)或配置文件([name].config.js)修改后,需要手动重启调试,当前版本并不会自动监听这些文件。

全局变量

在源码中可以使用以下的全局变量(通过DefinePlugin提供):

  • process.env.XXX:对应环境变量中的值。
  • $features.xxx:对应Feature Matrix中的特性值。
  • $build.mode:构建时的mode值,建议使用这个变量来代替process.env.NODE_ENV
  • $build.version:当前构建的版本号。
  • $build.target:当前构建的目标。
  • $build.time:当前构建的时间,为ISO格式字符串。

如果你使用@reskript/cli-lint进行代码检查,以上全局变量可直接使用,不会被lint功能认为错误。

特殊文件命名

以下是可用的一系列特殊处理的文件命名规则:

  • *.global.less:定义全局的样式,不会经过CSS Modules处理。
  • *.worker.js:定义Web Worker,会被编译成一个Worker类。
6.2.1

2 months ago

6.2.0

3 months ago

6.1.1

5 months ago

6.1.0

5 months ago

6.0.1

9 months ago

6.0.0

11 months ago

6.0.3

7 months ago

6.0.2

8 months ago

6.0.0-beta.4

12 months ago

6.0.0-beta.3

1 year ago

6.0.0-beta.0

1 year ago

6.0.0-beta.1

1 year ago

6.0.0-beta.2

1 year ago

5.7.4

1 year ago

5.7.0-beta.0

2 years ago

5.6.1

2 years ago

5.7.3

1 year ago

5.7.2

2 years ago

5.7.1

2 years ago

5.7.0

2 years ago

5.4.0

2 years ago

5.6.0

2 years ago

5.3.0

2 years ago

5.2.1

2 years ago

5.0.0-beta.1

2 years ago

5.0.0

2 years ago

5.1.0

2 years ago

5.2.0

2 years ago

5.0.0-beta.0

2 years ago

4.0.1

2 years ago

4.0.0

2 years ago

3.0.0-beta.1

2 years ago

3.0.0-beta.0

2 years ago

4.3.0

2 years ago

3.0.4

2 years ago

3.0.3

2 years ago

3.0.2

2 years ago

3.0.1

2 years ago

3.0.6

2 years ago

3.0.5

2 years ago

3.0.0

2 years ago

4.2.1

2 years ago

4.2.0

2 years ago

2.5.4

2 years ago

2.5.3

2 years ago

4.0.0-beta.2

2 years ago

4.0.0-beta.1

2 years ago

4.0.0-beta.0

2 years ago

4.1.0

2 years ago

4.1.2

2 years ago

4.1.1

2 years ago

2.4.0

2 years ago

2.5.0

2 years ago

2.5.2

2 years ago

2.5.1

2 years ago

2.3.0

3 years ago

2.2.1

3 years ago

2.2.0

3 years ago

2.2.2

3 years ago

2.1.0

3 years ago

2.0.0

3 years ago

1.15.3

3 years ago

1.15.2

3 years ago

2.0.0-beta.2

3 years ago

2.0.0-beta.1

3 years ago

2.0.0-beta.5

3 years ago

2.0.0-beta.4

3 years ago

2.0.0-beta.3

3 years ago

1.15.0

3 years ago

1.15.1

3 years ago

1.14.2

3 years ago

1.14.1

3 years ago

1.14.0

3 years ago

1.13.1

3 years ago

1.13.0

3 years ago

1.12.2

3 years ago

1.12.1

3 years ago

1.12.0

3 years ago

1.11.2

3 years ago

1.11.1

3 years ago

1.10.3

3 years ago

1.10.2

3 years ago

1.11.0

3 years ago

1.10.1

3 years ago

1.10.0

3 years ago

1.9.0

3 years ago

1.8.0

3 years ago

1.7.1

3 years ago

1.7.0

3 years ago

1.6.2

3 years ago

1.6.1

3 years ago

1.6.0

3 years ago

1.5.0

3 years ago

1.4.0

3 years ago

1.3.1

3 years ago

1.3.0

3 years ago

1.2.0

3 years ago

1.2.1

3 years ago

1.1.0

3 years ago

1.0.0

3 years ago

1.0.0-beta.37

3 years ago

1.0.0-beta.35

3 years ago

1.0.0-beta.36

3 years ago

1.0.0-beta.34

3 years ago

1.0.0-beta.33

3 years ago

1.0.0-beta.31

3 years ago

1.0.0-beta.30

3 years ago

1.0.0-beta.29

3 years ago

1.0.0-beta.28

3 years ago

1.0.0-beta.27

3 years ago

1.0.0-beta.26

3 years ago

1.0.0-beta.25

3 years ago

1.0.0-beta.24

3 years ago

1.0.0-beta.23

3 years ago

1.0.0-beta.22

3 years ago

1.0.0-beta.21

3 years ago

1.0.0-beta.20

3 years ago

1.0.0-beta.19

4 years ago

1.0.0-beta.18

4 years ago

1.0.0-beta.17

4 years ago

1.0.0-beta.15

4 years ago

1.0.0-beta.16

4 years ago

1.0.0-beta.13

4 years ago

1.0.0-beta.14

4 years ago

1.0.0-beta.12

4 years ago

1.0.0-beta.11

4 years ago

1.0.0-beta.10

4 years ago

1.0.0-beta.9

4 years ago

1.0.0-beta.8

4 years ago

1.0.0-beta.7

4 years ago

0.11.0

4 years ago

0.10.8

4 years ago

0.10.7

4 years ago

1.0.0-beta.6

4 years ago

1.0.0-beta.5

4 years ago

0.10.6

4 years ago

1.0.0-beta.4

4 years ago

1.0.0-beta.3

4 years ago

1.0.0-beta.2

4 years ago

1.0.0-beta.1

4 years ago

1.0.0-beta.0

4 years ago

0.10.4

4 years ago

0.10.5

4 years ago

0.10.0

4 years ago

0.10.2

4 years ago

0.10.3

4 years ago

0.9.3

4 years ago

0.9.0

4 years ago

0.9.2

4 years ago

0.9.1

4 years ago

0.8.8

4 years ago

0.8.1-beta.3

4 years ago

0.8.1-beta.2

4 years ago

0.8.1-beta.1

4 years ago

0.8.1-beta.0

4 years ago