编译配置 - compilation
Farm 默认从项目根目录的 farm.config.ts|js|mjs
文件中读取配置,配置文件示例:
import { defineConfig } from "@farmfe/core";
export default defineConfig({
root: process.cwd(), // 编译的根目录
// 编译选项
compilation: {
// ...
},
// Dev Server 选项
server: {
hmr: true,
// ...
},
// 插件配置
plugins: [],
});
本文档仅介绍 编译
选项的详细信息。 对于 server
或 shared
选项,请参阅 server 或 shared
编译选项 - compilation
所有与编译相关的配置都在 compilation
字段下。
input
- type:
Record<string, string>
项目的入口点。 Input 的文件可以是html
、ts/js/tsx/jsx
、css
或通过插件支持的其他文件。
import { defineConfig } from "@farmfe/core";
export default defineConfig({
compilation: {
input: {
index: "./index.html",
about: "./about.html",
},
},
// ..
};
output
- type:
OutputOptions
interface OutputOptions {
// 局部打包后,入口文件所在资源的文件名配置
entryFilename?: string;
// 局部打包后,除入口资源外的其他资源输入文件名配置
filename?: string;
// 输入目录
path?: string;
// public path:资源加载前缀
publicPath?: string;
// 静态资源文件名配置
assetsFilename?: string;
// 目标执行环境,浏览器或者 Node
targetEnv?: "browser" | "node";
// 输出模块格式
format?: "cjs" | "esm";
}
我们称编译结果为 资源(resource)
output.entryFilename
- 默认值:
"[entryName].[ext]"
配置入口资源的文件名:您可以使用 [entryName]
等占位符。 所有占位符如下:
[entryName]
:入口名,例如对于input: { index: "./index.html" }
,[entryName]
为index
[resourceName]
:资源的名称,一般是 Farm 内部生成的一个独特哈希值。[contentHash]
:该资源的内容哈希。[ext]
:该资源的扩展名,对于js/jsx/ts/tsx
为js
,对于css/scss/less
为css
。
output.filename
- 默认值:
"[resourceName].[ext]"
局部打包后,除 entryFilename
配置的资源外的其他资源文件名. 所有占位符如下:
[resourceName]
:资源的名称,一般是 Farm 内部生成的一个独特哈希值。[contentHash]
:该资源的内容哈希。[ext]
:该资源的扩展名,对于js/jsx/ts/tsx
为js
,对于css/scss/less
为css
。
output.path
- 默认值:
"dist"
输出资源的目录
output.publicPath
- 默认值:
"/"
资源 url 加载前缀。 例如 URL https://xxxx
或绝对路径 /xxx/
。 例如配置:
// ...
export default defineConfig({
compilation: {
output: {
publicPath: process.env.NODE_ENV === 'production' ? 'https://cdn.com' : '/'
}
}
// ...
});
在构建时,注入的资源 URL 将为 https://cdn.com/index-s2f3.s14dqwa.js
。 例如,在输出 html 中,所有 <script>
和 <link
> 将为:
<html>
<head>
<!-- ... -->
<link href="https://cdn.com/index-a23e.s892s1.css" />
</head>
<body>
<!-- ... -->
<script src="https://cdn.com/index-s2f3.s14dqwa.js"></script>
</body>
</html>
当加载 动态脚本和CSS时,动态获取的资源url也将是:https://cdn.com/<asset-path>
output.assetsFileName
- 默认值:
"[resourceName].[ext]"
静态资源输出的文件名配置,占位符和 output.filename
相同。
output.targetEnv
- 默认:
"browser-es2017"
配置产物的执行环境,可以是 浏览器
或 节点
。 Farm 会自动为您指定的 targetEnv
注入 polyfill
和降级语法(对于脚本和 css),支持的 targetEnv
如下:
针对 浏览器
:
browser-es2017
:将项目编译到原生支持async wait
的浏览器。browser-es2015
:将项目编译到原生支持es6 features
的浏览器。browser-legacy
:将项目编译为ES5
,例如IE9
。 请注意,这可能会引入大量的填充,从而使生产规模更大。 确保您确实需要支持IE9
等旧版浏览器。browser-esnext
:将项目编译到最新的现代浏览器,不会注入任何polyfill。浏览器
:browser-es2017
的别名
针对 Node.js
:
node16
:将项目编译到Node 16
。node-legacy
:将项目编译到Node 10
。node-next
:将项目编译到最新的 Node 版本,不会注入任何 polyfill。node
:node16
的别名
output.format
- 默认值:
"esm"
配置产物的格式,可以是 "esm"
或者 "cjs"
.
该选项只对 Js 产物有效
resolve
- type:
ResolveOptions
interface ResolveOptions {
extensions?: string[];
alias?: Record<string, string>;
mainFields?: string[];
conditions?: string[];
symlinks?: boolean;
strictExports?: boolean;
}
resolve.extensions
- 默认值:
["tsx", "ts", "jsx", "js", "mjs", "json", "html", "css"]
配置解析依赖时的后缀,例如解析 ./index
时,如果没有解析到,则会自动加上后缀解析,如尝试 ./index.tsx
, ./index.css
等。
resolve.alias
- 默认值:
{}
配置解析别名,示例:
export default defineConfig({
compilation: {
resolve: {
alias: {
"/@": path.join(process.cwd(), "src"),
stream$: "readable-stream",
"$__farm_regex:^/(utils)$": path.join(process.cwd(), "src/$1"),
},
},
},
});
alias 为前缀替换,对于上述例子 /@/pages
将会被替换为,/root/src/pages
。
如果希望精确匹配,可以加上 $
,例如 stream$
只会替换 stream
,而不会替换 stream/xxx
。
当然也支持使用正则表达式,例如 $__farm_regex:^/(utils)$
,将会匹配 /utils
,并替换为 /root/src/utils
。
resolve.mainFields
- 默认值:
["exports", "browser", "module", "main"]
解析 node_modules 下依赖时,从 package.json 中将会按照 mainFields
中配置的字段和顺序进行解析。对于 package.json
{
"name": "package-a",
"module": "es/index.js",
"main": "lib/index.js"
}
将会优先使用 es/index.js
(如果路径存在),不存在则会继续向后搜索。
resolve.conditions
暂不支持配置。
resolve.symlinks
- 默认值:
true
解析文件时,是否追踪 symlink 对应的真实目录,并从真实目录开始解析下一个依赖。如果使用 pnpm 管理依赖,该选项必须配置为 true。
resolve.strictExports
- 默认值:
false
是否严格遵循 package.json
中 exports
中定义的导出。如果设置为 true,当 package.json
中定义了 exports
,但是 exports
没有定义对应导出时,会直接报错。如果设置为 true,会按照 mainFields 继续尝试其他入口。
define
- 默认值:
{}
全局变量注入,配置的变量名和值将会在编译时注入到产物中。Farm 默认注入 process.env.NODE_ENV
以及部分 Farm 自身使用的变量比如 FARM_HMR_PORT
export default defineConfig({
compilation: {
define: {
MY_VAR: 123,
},
},
});
external
- 默认值:
[]
- 类型:
(string | Record<string, string>)[]
配置被 external 的导入,被 external 的导入不会出现在编译产物中。但是对应 import 语句不会删除,需要自定义 external 后如何处理,否则运行时会报错,对于 targetEnv 是 node 下的 external 模块,会自动尝试 require 该模块。
需要使用正则方式配置,例如:
export default defineConfig({
compilation: {
external: ["^stream$", { jquery: "Jquery" }],
},
});
externalNodeBuiltins
- 默认:
true
无论是否外部 module.builtinModules
,默认情况下,所有内置模块(如 fs
)都将是外部的。 您还可以将 externalNodeBuiltins
设置为 array
以手动将模块指定为外部:
export default defineConfig({
compilation: {
externalNodeBuiltins: ["^stream$"],
},
});
mode
- 默认值: 对于 start、watch 命令是
development
,对于 build 命令是production
配置编译模式,为了优化开发时性能,在没有手动配置生产优化相关选项(minify,tree shake 等)时,默认在 development
下会禁用生产环境优化比如压缩和 tree shake,在 production
模式下启用。
root
- 默认值:
process.cwd()
配置项目编译的 root 目录,该选项会影响默认配置文件的查找路径,编译模块依赖的查找等。
runtime
配置 Farm 运行时能力。类型如下:
interface FarmRuntimeOptions {
runtime?: {
path: string;
plugins?: string[];
namespace?: string;
isolate?: boolean;
};
}
runtime.path
- 默认值: Farm 内置 runtime 的路径
自定义一个 Runtime 替换 Farm 内置的 Runtime。
正常情况下不建议配置该选项,因为一旦配置了该选项,指向的 runtime 需要所有实现 Farm Runtime 已有的能力,例如模块系统、HMR、动态资源加载等。
runtime.plugins
- 默认值: Farm 内置 runtime-plugin-hmr 的路径
配置 Runtime 插件,通过 Runtime 插件,可以干预 Runtime 行为,如模块加载,资源加载等。具体可以参考:WIP。
runtime.namespace
- 默认值: 项目 package.json 的 name 字段
配置 Farm Runtime 的命名空间,保证在同一个 window 或者 global 下不同产物的执行能够相互隔离。默认使用项目 package.json 的 name 字段作为 namespace。
runtime.isolate
- 默认值:
false
默认情况下,html 中的运行时文件是内联写入的。如果您想以单独文件的形式弹出,从而减小 html 文件的大小,那么可以将此属性设为 true。 如果设置为 true,农场入口脚本将以单独文件的形式发布。
assets
assets.include
- 默认值:
[]
额外视为静态资源的文件后缀,例如下述示例,txt
将会被视为姿态资源,引入 txt 文件时当作静态资源处理:
export default defineConfig({
compilation: {
assets: {
include: ["txt"],
},
},
});