挑战21天手写前端框架 day13 解析用户配置文件,将框架行为交到用户手里

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 挑战21天手写前端框架 day13 解析用户配置文件,将框架行为交到用户手里

image.png


阅读本文需要 5 分钟,编写本文耗时 1 小时


到目前为止,我们的框架行为都是由我们的设计开发时制定的,但是实际项目中肯定会涉及到用户需要定制化的一些数据和定制化需求,由于我们并不是要写一个真正的前端框架,因此我们还是以管控能力为主,尽量将最少的配置能力给到用户。尽量只让用户配置一些框架无关的信息和数据,这将意味着用户需要知道的前端工程化的东西非常的少。借此来提升本次框架的用户开发体验。即整个项目技术栈的选择,都有框架设计统一制定。其实这个思路非常适合用在公司内部团队中构建的框架方案中。


首先依旧随便约定一个配置文件的名字 malita.config.ts 然后将它放到根目录下,然后我们还是用昨天构建“生命周期函数”的方式,增加一个生命周期,getUserConfig


比如就按住我们昨天留下的两个配置需求将真正的 keepalive 需求,传递到 中,使用用户配置 title 作为页面 dom 的title。

export default {
    title: 'Hello',
    keepalive: [/./]
}
复制代码


然后我们尝试着将它引入到我们的框架中,

import { existsSync } from 'fs';
import path from 'path';
import type { AppData } from './appData';
import { DEFAULT_CONFIG_FILE } from './constants';
export const getUserConfig = ({ appData }: { appData: AppData; }) => {
    return new Promise((resolve, rejects) => {
        let config = {};
        const configFile = path.resolve(appData.paths.absSrcPath, DEFAULT_CONFIG_FILE);
        if (existsSync(configFile)) {
            config = require(configFile).default;
        }
        resolve(config);
    })
}
复制代码


结果并不像我们设想的那样被成功引入,我们在控制台上看到有如下错误:

/Users/congxiaochen/Documents/malita/examples/app/malita.config.ts:1
export default {
^^^^^^
SyntaxError: Unexpected token 'export'
复制代码


这是因为我们的 malita dev 是运行在 es5 的环境下的。但是我们的配置文件使用的却是 es6 的语法。 我们可以尝试着修改配置文件``,将它改成 es5 的语法

module.exports = {
    title: 'Hello',
    keepalive: [/./]
}
复制代码


这是便可以正确获取到配置信息了

> malita dev
App listening at http://127.0.0.1:8888
{ title: 'Hello', keepalive: [ /./ ] }
复制代码



配置构建

所有当你在框架开发中遇到类似的错误时,你就可以往语法未正确转换,即文件未编译这个思路上去分析和定位,做同样的尝试,如果修改后文件可用,那么你就可以确定下来问题所在。在提出针对性的解法,比如这里文件未转译,我们就使用 esbuild 对文件进行构建。


构建方法与我们构建主入口文件一直,需要注意的是我们需要导出使用,因此需将 format 改为 cjs:

import { existsSync } from 'fs';
import path from 'path';
import { build } from 'esbuild';
import type { AppData } from './appData';
import { DEFAULT_CONFIG_FILE } from './constants';
export const getUserConfig = ({ appData, sendMessage }: { appData: AppData; sendMessage: (type: string, data?: any) => void; }) => {
    return new Promise(async (resolve, rejects) => {
        let config = {};
        const configFile = path.resolve(appData.paths.cwd, DEFAULT_CONFIG_FILE);
        if (existsSync(configFile)) {
            await build({
                format: 'cjs',
                logLevel: 'error',
                outdir: appData.paths.absOutputPath,
                bundle: true,
                watch: {
                    onRebuild: (err, res) => {
                        if (err) {
                            console.error(JSON.stringify(err));
                            return;
                        }
                        sendMessage('reload');
                    }
                },
                define: {
                    'process.env.NODE_ENV': JSON.stringify('development'),
                },
                external: ['esbuild'],
                entryPoints: [configFile],
            });
            try {
                config = require(path.resolve(appData.paths.absOutputPath, 'malita.config.js')).default;
            } catch (error) {
                console.error('getUserConfig error', error);
                rejects(error);
            }
        }
        resolve(config);
    })
}
复制代码



配置使用

keepalive

keepalive 配置传递到 generateEntry 函数中 ,修改 malita.config.ts 中的配置,验证配置是否有效。我们将状态保持配置修改为只有 users 页面能够被保持。

export default {
    title: 'Hello',
    keepalive: ['/users']
}
复制代码


值得注意的是,我们的 keepalive 配置是支撑正则表达式的,但是正则表达式在 JSON.stringify 会被转换成 {},因此我们需要编写一个工具类,来对这个配置做特殊的处理,

const configStringify = (config: (string | RegExp)[]) => {
    return config.map((item) => {
        if (item instanceof RegExp) {
            return item;
        }
        return `'${item}'`;
    });
};
复制代码


然后修改 KeepAliveLayout 配置的获取方式

`
const App = () => {
    return (
        <KeepAliveLayout keepalive={[${configStringify(
            (userConfig.keepalive) || [],
        )}]}>
            <HashRouter>
                <Routes>
                    ${routesStr}
                </Routes>
            </HashRouter>
        </KeepAliveLayout>
    );
}
`
复制代码


执行 malita dev 验证效果。


title

title 配置传递到 generateHtml 函数中

const title = userConfig?.title ?? appData.pkg.name ?? 'Malita';
 <title>${title}</title>
复制代码


打开页面重控制台查看页面的 html

<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
复制代码


至此我们就简单的完成了用户配置的功能,不知道有没有细心的小伙伴发现了,在 malita dev 启动之后,修改配置之后,虽然页面有重新加载,但是配置数据的变更并没有被真正的覆盖到原来的逻辑,原因是我们仅仅重启了我们的浏览器端,但是并没有重启我们的服务端,这个问题我们将会在明天解决。


感谢阅读,明天我们将会解决上面提到的问题,并且添加框架内置的 http 请求方法,用于在项目中请求服务端数据。其中将会涉及到本地 mock 文件的解析和代理中间件的编写。如果你对这些内容感兴趣,请持续 follow 这个专题。


源码归档

目录
相关文章
|
3月前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
111 9
|
19天前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
95 12
|
15天前
|
小程序 前端开发 关系型数据库
uniapp跨平台框架,陪玩系统并发性能测试,小程序源码搭建开发解析
多功能一体游戏陪练、语音陪玩系统的开发涉及前期准备、技术选型、系统设计与开发及测试优化。首先,通过目标用户分析和竞品分析明确功能需求,如注册登录、预约匹配、实时语音等。技术选型上,前端采用Uni-app支持多端开发,后端选用PHP框架确保稳定性能,数据库使用MySQL保证数据一致性。系统设计阶段注重UI/UX设计和前后端开发,集成WebSocket实现语音聊天。最后,通过功能、性能和用户体验测试,确保系统的稳定性和用户满意度。
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
2月前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
|
2月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
3月前
|
前端开发 JavaScript API
前端界的秘密武器:掌握这些框架,让你轻松秒杀99%的同行!
前端开发日新月异,掌握几个明星框架如React、Vue.js和Angular,不仅能让工作更得心应手,还能轻松超越同行。React以高效的虚拟DOM和组件化著称;Vue.js简洁易懂,灵活性高;Angular提供全面的解决方案,适合大型应用。此外,轻量级的Svelte也值得关注,其编译时处理设计提升了应用性能。掌握这些框架,结合深刻理解和灵活运用,助你在前端领域脱颖而出。
44 9
|
3月前
|
JSON PHP 数据格式
PHP解析配置文件的常用方法
INI文件是最常见的配置文件格式之一。
64 12
|
3月前
|
机器学习/深度学习 编解码 前端开发
探索无界:前端开发中的响应式设计深度解析####
【10月更文挑战第29天】 在当今数字化时代,用户体验的优化已成为网站与应用成功的关键。本文旨在深入探讨响应式设计的核心理念、技术实现及最佳实践,揭示其如何颠覆传统布局限制,实现跨设备无缝对接,从而提升用户满意度和访问量。通过剖析响应式设计的精髓,我们将一同见证其在现代Web开发中的重要地位与未来趋势。 ####
60 7
|
3月前
|
编解码 前端开发 UED
探索无界:前端开发中的响应式设计深度解析与实践####
【10月更文挑战第29天】 本文深入探讨了响应式设计的核心理念,即通过灵活的布局、媒体查询及弹性图片等技术手段,使网站能够在不同设备上提供一致且优质的用户体验。不同于传统摘要概述,本文将以一次具体项目实践为引,逐步剖析响应式设计的关键技术点,分享实战经验与避坑指南,旨在为前端开发者提供一套实用的响应式设计方法论。 ####
94 4

热门文章

最新文章

推荐镜像

更多