用于快速配置 craco.config.js 文件,支持基于文档地址动态指定文档中URL资源地址
基于webpack5
和@craco/craco@7.0.0
npm install @biulight/craco-config-extensions --save-dev
yarn add --dev @biulight/craco-config-extensions
修改
webpack
配置的钩子函数
modifyOutputConfig
修改webpack
的output
配置
addDefinitionsEnvValue
修改DefinePlugin
插件
addHtmlWebpackPlugin
修改 html-webpack-plugin
插件
addInterpolateHtmlPlugin
修改create-react-app
内置的InterpolateHtmlPlugin
插件
addSplitChunksPlugin
修改webpack
的Optimization.splitChunks
HtmlWebpackInjectHead
详见动态加载指定域名静态资源方案一
HtmlWebpackMixinRobot
详见动态加载指定域名静态资源方案二
sassResourcesLoader
sass-resources-loader
的craco
版本
const { sassResourcesLoader } = require(`@biulight/craco-config-extensions`)
module.exports = {
plugins: [
{
plugin: sassResourcesLoader,
options: {
resources: 'src/common/index.scss'
}
}
],
}
override
高阶函数,支持配置函数链式调用,详见示例
stringifyVal
将对象中value转换成JSON字符串
readAllDotenvFiles
读取指定.env
文件中指定前缀的变量
LoadRobot
使用方式详见LoadRobot
override
函数const { override } = require("@biulight/craco-config-extensions")
module.exports = {
webpack: {
configure: override(func1, func2),
},
}
const { HtmlWebpackInjectHead } = require("@biulight/craco-config-extensions")
module.exports = {
webpack: {
plugins: {
add: [
new HtmlWebpackInjectHead({
content: "<script src='preload.worker.js'></script>" /* 插入的内容 */,
position:
"start" /* start(默认值): 在head顶部插入; end: 在head底部插入*/,
}),
],
},
},
}
.env
文件中指定前缀配置文件读取规则等同于
create-react-app
脚手架中读取.env
.env.production
__DYNAMIC_KEY=production.html.example.com
__DYNAMIC_ENV=PRD
__DYNAMIC_DOMAIN_SERVER=production.server.example.com
__DYNAMIC_STATIC_DOMAIN=production.cdn.example.com
const { readAllDotenvFiles } = require("@biulight/craco-config-extensions")
// 读取.env.production, .env.develpment, .env.stg 等文件
const { __DYNAMIC: DYNAMIC_ENV } = readAllDotenvFiles(
["production", "development", "stg"],
"__DYNSMIC"
)
/*
DYNAMIC_ENV:
*/
__DYNAMIC_KEY
会被忽略,只用来指定 html 文件资源域名__DYNAMIC_STATIC_DOMAIN
: 当与loadRobot
结合使用时,会自动创建base
标签,并把 href 指向它的值import CracoEnv from "@biulight/craco-config-extensions/dist/loadRobot"
// 创建
const envInstance = CracoEnv.createInstance({
"production.html.example.com": {
ENV: "PRD",
DOMAIN_SERVER: "production.server.example.com",
// STATIC_DOMAIN: "production.cdn.example.com",
},
localhost: {
ENV: "DEV",
DOMAIN_SERVER: "/api",
// STATIC_DOMAIN: "/",
},
})
// 使用
const server = envInstance.DOMAIN_SERVER
结合
HtmlWebpackInjectHead
或HtmlWebpackMixinRobot
使用时
import CracoEnv from "@biulight/craco-config-extensions/dist/loadRobot"
const envInstance = CracoEnv.getInstance();
const server = envInstance.DOMAIN_SERVER;
依托
html
文件域名,动态加载指定 cdn 静态资源
_BIU_LOAD_ROBOT
// 编辑craco.config.js文件
const CopyWebpackPlugin = require("copy-webpack-plugin")
const { HtmlWebpackInjectHead } = require("@biulight/craco-config-extensions")
module.exports = {
webpack: {
plugins: {
add: [
// 复制文件到打包产物目录
new CopyWebpackPlugin({
patterns: [
{
from: "node_modules/@biulight/craco-config-extensions/dist/loadRobot/index.umd.js",
to: "preload.worker.js",
},
],
}),
// 注入模板
new HtmlWebpackInjectHead({
content: "<script src='preload.worker.js'></script>" /* 插入的内容 */,
position:
"start" /* start(默认值): 在head顶部插入; end: 在head底部插入*/,
}),
],
},
},
}
html
模版中注入变量module.exports = {
webpack: {
configure: override(
addInterpolateHtmlPlugin({
...stringifyVal({ DYNAMIC_ENV }),
})
),
},
}
html
模板<!-- head头部加入实例化loadRobot逻辑 -->
<script>
_BIU_LOAD_ROBOT.createInstance(JSON.parse("%DYNAMIC_ENV%"))
</script>
HtmlWebpackPlugin
插件将生成的 webpack
文件添加到资产html-webpack-plugin
// 编辑craco.config.js
const HtmlWebpackPlugin = require("html-webpack-plugin")
module.exports = {
webpack: {
plugins: {
add: [
new HtmlWebpackPlugin({
...
inject: false, // disable automatic injections
})
]
}
}
}
html
模板,动态加载资源<head>
<!-- 插入如下代码 -->
<%= "<script>" %>
_BIU_LOAD_ROBOT.load([..."<%= htmlWebpackPlugin.files.css %>,<%= htmlWebpackPlugin.files.js %>".split(",")])
<%= "</script>" %>
</head>
inject: false
示例,参考html-webpack-plugin
模板语法参考EJS
使用
HtmlWebpackMixinRobot
插件
修改craco.config.js
插件
HtmlWebpackPlugin
插件将生成的 webpack
文件添加到资产html-webpack-plugin
// 编辑craco.config.js
const HtmlWebpackPlugin = require("html-webpack-plugin")
module.exports = {
webpack: {
plugins: {
add: [
new HtmlWebpackPlugin({
...
scriptLoading: "blocking", // 动态创建`script`标签时,`defer` 属性不生效
})
]
}
}
}
HtmlWebpackMixinRobot
插件动态创建base
标签并添加资产const CopyWebpackPlugin = require("copy-webpack-plugin")
const { HtmlWebpackMixinRobot } = require("@biulight/craco-config-extensions")
module.exports = {
webpack: {
plugins: {
add: [
// 复制文件到打包产物目录
new CopyWebpackPlugin({
patterns: [
{
from: "node_modules/@biulight/craco-config-extensions/dist/loadRobot/index.umd.js",
to: "preload.worker.js",
},
],
}),
// js创建标签,添加 `webpack` bundle
new HtmlWebpackMixinRobot(HtmlWebpackPlugin, {
env: JSON.stringify(DYNAMIC_ENV), // 可选,默认值:默认读取 .env 文件动态变量
robotUrl: "preload.worker.js", // 可选, 当`robotUrl`和`env`同时存在,会实例化`loadRobot`类
robotInstance: "BIU_BIU", // 可选,挂载在`global`对象上key,默认值`BIU_LIGHT_ROBOT_INSTANCE`
force: true, // 可选,是否强制匹配pathname,默认值false(不匹配)
prefix: "__DYNAMIC" // 可选,当env配置为空时,指定 .env 文件动态变量的前缀,默认值 `__DYNAMIC`
})
]
}
}
}
DYNAMIC_ENV
: 详见读取指定.env
文件中指定前缀配置
Generated using TypeDoc