⚠️温馨提示: 文档中包含【7个】暂不支持的区域,请通过搜索关键字【暂不支持的文档区域】进行后续处理

multi-client-notes.zip

很多同学可能第一次来,我分享了很多干货公开课,希望对你的技术成长有帮助!免费分享都在这里,需要 文档和配套视频找咨询老师 领取~

【飞书文档】备战金九银十,进阶大前端,涨薪全突破! 跳槽涨薪需求同学必看

【飞书文档】项目没有难点亮点?字节大佬带你前端项目弯道超车

【飞书文档】字节大佬带你弯道超车,深入剖析大厂面试真题~

【飞书文档】面试被算法干吐了?字节大佬带你突破极限,冲击 30K+ 必掌握算法与 WebAssembly 技术 冲刺年包 50W+ 同学必看


【飞书文档】高级前端专家如何做性能优化?特邀字节大佬细数飞书应用优化细节【超详细内培版】

【飞书文档】高级前端专家如何做项目架构与工程化设计? 特邀字节大佬细数字节开源项目架构细节【超详细内培版】

【飞书文档】小小微前端,轻松拿捏,特邀字节大佬开讲微前端架构与源码剖析【内部培训版】 35K+ 同学必看

【飞书文档】高级前端专家如何做性能优化?特邀字节大佬细数飞书应用优化细节(二)【内部培训版】


【飞书文档】前端破局 AI 应用开发,特邀字节大佬分享字节系 AI 场景落地应用与 AI 引擎编排流程 探索前端新方向同学福音

【飞书文档】React18 源码深度剖析,字节面试官教你轻松拿捏高级前端专家面试框架原理题

【飞书文档】Vue3 源码深度剖析,字节面试官教你轻松拿捏高级前端专家面试框架原理题

【飞书文档】Vite 构建过程与源码深度剖析,你怎么也想不到一线大厂工程化构建面试会问这么深!

【飞书文档】脚手架/CLI 工具原理与开发实践,特邀字节前端专家带你体悟大厂团队基建与研发工作流 团队基建必看

【飞书文档】Webpack 原理深度解读与面试专项突击,字节面试官带你手撕难缠打包构建面试原理题 工程化与构建原理深入


【飞书文档】冲击中大厂筹备与涨薪突击最优方案,特邀字节面试官带你体验大厂面试全流程

【飞书文档】字节面试专场——中厂在职学员冲击大厂 30K+,看看面试官如何评价 大厂模拟面试,问得很深慎看

【飞书文档】前端性能与异常监控平台全链路设计与实践,字节架构师:掌握这整套拿个 40K+ 不在话下吧

【飞书文档】飞书文档协同编辑器技术揭秘,特邀字节架构师分享富文本编辑器方案细节

【飞书文档】大数据可视化引擎与数字孪生平台设计浅析,字节架构师:一起来剖析 DataWind 数据洞察平台架构之道


【飞书文档】服务端渲染(SSR)与前后端同构技术原理揭秘,字节前端专家带你光速进阶全栈 进阶必学

【飞书文档】Babel 与编译原理详解,字节高级前端专家带你从零实现飞书表格公式执行器

【飞书文档】Nest 服务端开发与原理深度剖析,《NestJS 实战》作者带你领略框架设计之美 全栈进阶,企业级框架

  1. 多端开发核心原理
  2. 多端框架编译与运行时处理细则
  3. 移动端与桌面端多端开发方案设计与实践,多端差异抹平
  • 初中级 】多端开发了解过吗?说说 Taro、Tauri、Flutter 基础使用与原理?
  • 中高级 】请详细说说多端开发框架的原理与优劣势,以 Taro、Flutter 为例说明
  • 专家级 】假设让你来做多端开发产品向前端 Leader,简要说明你的评审与设计思路

初中级 】多端开发了解过吗?说说 Taro、Tauri、Flutter 基础使用与原理?

Taro 4.0.6 基础使用

Taro 是一个开放式跨端跨框架解决方案,支持使用 React/Vue/Nerv 等框架来开发 微信/京东/百度/支付宝/字节跳动/QQ/飞书 小程序、H5、RN 等应用。

主要特性

  • 支持使用 React/Vue/Nerv 等框架来开发小程序
  • 支持多端同构开发
  • 支持 TypeScript
  • 统一接口抽象,支持多端 API 兼容
  • 支持插件机制,扩展性强

基础使用

环境搭建

# 安装 Taro CLI
npm install -g @tarojs/cli

# 创建项目
taro init myApp

# 选择配置
? 请选择框架? React
? 是否使用 TypeScript ? Yes
? 请选择 CSS 预处理器(Sass/Less/Stylus) Sass
? 请选择编译工具(Webpack4/Webpack5/Vite) Webpack5

项目结构

├── config                 配置目录
|   ├── dev.js            开发时配置
|   ├── index.js          默认配置
|   └── prod.js           打包时配置
├── src                   源码目录
|   ├── pages             页面文件目录
|   |   └── index        index 页面目录
|   |       ├── index.js  index 页面逻辑
|   |       └── index.css index 页面样式
|   ├── app.css          项目总通用样式
|   └── app.js           项目入口文件
└── package.json

基础组件使用

import { View, Text, Button } from '@tarojs/components'

function Index() {
  return (
    <View className='index'>
      <Text>Hello World!</Text>
      <Button>点击按钮</Button>
    </View>
  )
}

核心概念

跨端开发方案

  1. 多端同构

    • 统一的组件规范
    • 统一的 API 规范
    • 统一的路由规范
  2. 条件编译

if (process.env.TARO_ENV === 'weapp') {
  // 微信小程序特有代码
} else if (process.env.TARO_ENV === 'h5') {
  // H5 特有代码
}

生命周期

  1. 应用生命周期
class App extends Component {
  componentDidMount() {}
  componentDidShow() {}
  componentDidHide() {}
}
  1. 页面生命周期
class Index extends Component {
  onLoad() {}      // 页面加载时触发
  onShow() {}      // 页面显示时触发
  onReady() {}     // 页面初次渲染完成时触发
  onHide() {}      // 页面隐藏时触发
  onUnload() {}    // 页面卸载时触发
}

路由功能

import Taro from '@tarojs/taro'

// 页面跳转
Taro.navigateTo({
  url: '/pages/detail/index?id=1'
})

// 获取路由参数
Taro.getCurrentInstance().router.params

多端开发编译与运行时处理详解

编译流程

  1. 代码解析阶段

    • 解析 JSX/TSX 代码
    • 处理条件编译
    • 分析依赖关系
  2. 代码转换阶段

    • 组件转换
    • API 转换
    • 样式转换
  3. 代码生成阶段

    • 生成目标平台代码
    • 处理静态资源
    • 生成项目配置文件

运行时处理

  1. 框架运行时

    • 生命周期映射
    • 事件系统处理
    • 状态管理适配
  2. 组件运行时

    • 组件映射
    • 属性转换
    • 事件处理
  3. API 运行时

    • API 抹平层
    • 平台差异化处理
    • polyfill 支持

⚠️ 暂不支持的文档区域,【文档小组件】

Tauri 2.0.6 基础使用

Tauri 简介

Tauri 是一个构建跨平台桌面应用程序的框架,它允许开发者使用 Web 技术栈来创建轻量级的本地应用程序。Tauri 应用由两部分组成:一个 Rust 编写的后端核心和一个 Web 前端。

主要特性

  • 轻量级 :最小的 Hello World 应用仅 ~3MB
  • 安全性 :默认采用安全优先的设计理念
  • 性能优异 :Rust 后端保证了高性能
  • 跨平台 :支持 Windows、macOS、Linux
  • 多前端框架 :支持 Vue、React、Svelte 等
  • 系统集成 :深度系统API集成能力

环境搭建

系统要求

# Windows 环境要求
- Microsoft Visual Studio C++ 构建工具
- WebView2
- Rust 1.70 或更高版本

# macOS 环境要求
- Xcode Command Line Tools
- Rust 1.70 或更高版本

# Linux 环境要求
- libwebkit2gtk-4.0-dev
- build-essential
- curl
- wget
- libssl-dev
- libgtk-3-dev
- Rust 1.70 或更高版本

安装步骤

pnpm create tauri-app myApp
# 1. 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 2. 安装 Tauri CLI
cargo install tauri-cli

# 3. 创建项目
# 使用 React + Vite
npm create vite@latest my-tauri-app -- --template react-ts
cd my-tauri-app
npm install

# 4. 初始化 Tauri
cargo tauri init

项目结构

my-tauri-app/
├── src/                  # 前端源码
├── src-tauri/           # Tauri/Rust 源码
│   ├── Cargo.toml       # Rust 依赖配置
│   ├── tauri.conf.json  # Tauri 配置
│   └── src/
│       └── main.rs      # Rust 主程序
├── package.json         # 前端依赖配置
└── vite.config.ts       # Vite 配置

基础功能实现

配置文件详解

// src-tauri/tauri.conf.json
{
  "build": {
    "beforeDevCommand": "npm run dev",
    "beforeBuildCommand": "npm run build",
    "devPath": "http://localhost:1420",
    "distDir": "../dist"
  },
  "package": {
    "productName": "my-tauri-app",
    "version": "0.1.0"
  },
  "tauri": {
    "allowlist": {
      "all": false,
      "shell": {
        "all": false,
        "open": true
      },
      "dialog": {
        "all": true
      }
    },
    "bundle": {
      "active": true,
      "icon": [
        "icons/32x32.png",
        "icons/128x128.png",
        "icons/128x128@2x.png",
        "icons/icon.icns",
        "icons/icon.ico"
      ],
      "identifier": "com.myapp.dev",
      "targets": "all"
    },
    "security": {
      "csp": null
    },
    "updater": {
      "active": false
    },
    "windows": [
      {
        "fullscreen": false,
        "resizable": true,
        "title": "My Tauri App",
        "width": 800,
        "height": 600
      }
    ]
  }
}

前端集成

// src/App.tsx
import { invoke } from '@tauri-apps/api/tauri';
import { open } from '@tauri-apps/api/dialog';
import { useState } from 'react';

function App() {
  const [result, setResult] = useState<string>('');

  async function greet() {
    // 调用 Rust 函数
    const response = await invoke('greet', { name: 'World' });
    setResult(response as string);
  }

  async function openFile() {
    // 打开文件选择器
    const selected = await open({
      multiple: false,
      filters: [{
        name: 'Text',
        extensions: ['txt']
      }]
    });
    console.log(selected);
  }

  return (
    <div className="container">
      <button onClick={greet}>Greet</button>
      <button onClick={openFile}>Open File</button>
      <p>{result}</p>
    </div>
  );
}

export default App;

Rust 宿主桌面端实现

// src-tauri/src/main.rs
#![cfg_attr(
    all(not(debug_assertions), target_os = "windows"),
    windows_subsystem = "windows"
)]

use tauri::Manager;

// 定义命令
#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}

// 自定义菜单
#[derive(Clone, serde::Serialize)]
struct Payload {
    message: String,
}

fn main() {
    tauri::Builder::default()
        // 注册命令
        .invoke_handler(tauri::generate_handler![greet])
        // 添加菜单
        .menu(tauri::Menu::os_default("My App"))
        // 设置启动事件
        .setup(|app| {
            #[cfg(debug_assertions)]
            app.get_window("main").unwrap().open_devtools();
            Ok(())
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

进阶功能

系统集成

// 系统托盘
use tauri::{CustomMenuItem, SystemTray, SystemTrayMenu, SystemTrayEvent};

fn main() {
    let quit = CustomMenuItem::new("quit".to_string(), "Quit");
    let tray_menu = SystemTrayMenu::new()
        .add_item(quit);
    let system_tray = SystemTray::new()
        .with_menu(tray_menu);

    tauri::Builder::default()
        .system_tray(system_tray)
        .on_system_tray_event(|app, event| match event {
            SystemTrayEvent::MenuItemClick { id, .. } => {
                match id.as_str() {
                    "quit" => {
                        app.exit(0);
                    }
                    _ => {}
                }
            }
            _ => {}
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

IPC 通信示例

// Rust 后端
#[tauri::command]
async fn perform_task(value: String) -> Result<String, String> {
    // 异步任务处理
    Ok(format!("Processed: {}", value))
}

// TypeScript 前端
import { invoke } from '@tauri-apps/api/tauri';

async function handleTask() {
    try {
        const result = await invoke('perform_task', { 
            value: 'test data' 
        });
        console.log(result);
    } catch (e) {
        console.error(e);
    }
}

打包发布

# 开发模式运行
cargo tauri dev

# 构建发布版本
cargo tauri build

# 指定平台构建
cargo tauri build --target x86_64-pc-windows-msvc
cargo tauri build --target x86_64-apple-darwin
cargo tauri build --target x86_64-unknown-linux-gnu

⚠️ 暂不支持的文档区域,【文档小组件】

Flutter 3.24.3 基础使用

Flutter 简介

Flutter 是 Google 开发的开源 UI 软件开发工具包,使用 Dart 语言开发,可以快速在 iOS、Android、Web 和桌面平台上构建高质量的原生用户界面。

核心特性

  • 热重载 :支持亚秒级的热重载开发体验
  • 跨平台 :一套代码运行在多个平台
  • 高性能 :直接编译成原生代码,60fps 流畅体验
  • 自绘引擎 :使用 Skia 图形引擎自绘 UI
  • 丰富的组件 :Material Design 和 Cupertino 风格组件
  • 响应式框架 :基于响应式编程范式

环境搭建

系统要求

# Windows 要求
- Windows 10 或更高版本 (64-bit)
- Git
- Visual Studio 2022 或更高版本

# macOS 要求
- macOS Catalina (10.15) 或更高版本
- Xcode 14.0 或更高版本
- CocoaPods

# Linux 要求
- Ubuntu 20.04 LTS 或更高版本
- Git
- clang

安装步骤

# 1. 下载 Flutter SDK
git clone https://github.com/flutter/flutter.git -b stable

# 2. 添加环境变量
export PATH="$PATH:`pwd`/flutter/bin"

# 3. 运行诊断命令
flutter doctor

# 4. 创建新项目
flutter create my_app
cd my_app

# 5. 运行项目
flutter run

项目结构

my_app/
├── android/          # Android 平台相关代码
├── ios/             # iOS 平台相关代码
├── lib/             # Dart 源代码
│   └── main.dart    # 应用入口文件
├── test/            # 测试代码
├── web/             # Web 平台相关代码
├── pubspec.yaml     # 项目配置和依赖
└── analysis_options.yaml  # 代码分析配置

基础组件使用

Widget 介绍

// 基础 StatelessWidget
class MyWidget extends StatelessWidget {
  const MyWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text('Hello Flutter'),
    );
  }
}

// 有状态 StatefulWidget
class CounterWidget extends StatefulWidget {
  const CounterWidget({Key? key}) : super(key: key);

  @override
  State<CounterWidget> createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('Count: $_counter'),
        ElevatedButton(
          onPressed: _incrementCounter,
          child: Text('Increment'),
        ),
      ],
    );
  }
}

布局组件

// 常用布局示例
class LayoutDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Layout Demo')),
      body: Column(
        children: [
          // Row 水平布局
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              Icon(Icons.star, size: 30),
              Icon(Icons.star, size: 30),
              Icon(Icons.star, size: 30),
            ],
          ),
          
          // Stack 层叠布局
          Stack(
            children: [
              Container(
                width: 200,
                height: 200,
                color: Colors.blue,
              ),
              Positioned(
                right: 10,
                top: 10,
                child: Icon(Icons.close),
              ),
            ],
          ),
          
          // Expanded 弹性布局
          Row(
            children: [
              Expanded(
                flex: 2,
                child: Container(color: Colors.red, height: 50),
              ),
              Expanded(
                flex: 1,
                child: Container(color: Colors.green, height: 50),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

状态管理

// Provider 状态管理示例
class CounterModel extends ChangeNotifier {
  int _count = 0;
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}

// 使用 Provider
void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => CounterModel(),
      child: MyApp(),
    ),
  );
}

// 消费 Provider
class CounterWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<CounterModel>(
      builder: (context, counter, child) {
        return Text('Count: ${counter.count}');
      },
    );
  }
}

路由与导航

基础路由

// 命名路由注册
MaterialApp(
  routes: {
    '/': (context) => HomeScreen(),
    '/details': (context) => DetailScreen(),
  },
);

// 路由跳转
Navigator.pushNamed(context, '/details');

// 带参数路由
Navigator.pushNamed(
  context,
  '/details',
  arguments: {'id': 1, 'title': 'Detail Page'},
);

路由配置

// GoRouter 配置示例
final router = GoRouter(
  routes: [
    GoRoute(
      path: '/',
      builder: (context, state) => HomeScreen(),
    ),
    GoRoute(
      path: '/details/:id',
      builder: (context, state) {
        final id = state.params['id'];
        return DetailScreen(id: id);
      },
    ),
  ],
);

// 使用 GoRouter
MaterialApp.router(
  routerConfig: router,
);

网络请求与数据处理

HTTP 请求

// Dio 网络请求示例
class ApiService {
  final Dio _dio = Dio();

  Future<List<User>> getUsers() async {
    try {
      final response = await _dio.get('https://api.example.com/users');
      return (response.data as List)
          .map((json) => User.fromJson(json))
          .toList();
    } catch (e) {
      throw Exception('Failed to load users');
    }
  }

  Future<User> createUser(User user) async {
    try {
      final response = await _dio.post(
        'https://api.example.com/users',
        data: user.toJson(),
      );
      return User.fromJson(response.data);
    } catch (e) {
      throw Exception('Failed to create user');
    }
  }
}

数据持久化

// SharedPreferences 示例
class PreferencesService {
  static late SharedPreferences _prefs;

  static Future<void> init() async {
    _prefs = await SharedPreferences.getInstance();
  }

  static Future<void> setString(String key, String value) async {
    await _prefs.setString(key, value);
  }

  static String getString(String key) {
    return _prefs.getString(key) ?? '';
  }
}

// Hive 数据库示例
@HiveType(typeId: 0)
class User extends HiveObject {
  @HiveField(0)
  late String name;

  @HiveField(1)
  late String email;
}

// 使用 Hive
Future<void> saveUser(User user) async {
  final box = await Hive.openBox<User>('users');
  await box.add(user);
}

架构

整体架构

⚠️ 暂不支持的文档区域,【文档小组件】

生命周期

⚠️ 暂不支持的文档区域,【文档小组件】

⚠️ 暂不支持的文档区域,【文档小组件】

中高级 】请详细说说多端开发框架的原理与优劣势,以 Taro 为例说明

编译时处理机制

代码解析阶段

AST解析与处理

// 源代码
function Index() {
  return (
    <View className='index'>
      <Text>Hello World!</Text>
    </View>
  )
}

// 解析为AST后的核心节点
{
  type: "Program",
  body: [{
    type: "FunctionDeclaration",
    id: { type: "Identifier", name: "Index" },
    body: {
      type: "ReturnStatement",
      argument: {
        type: "JSXElement",
        // ... JSX节点信息
      }
    }
  }]
}

条件编译处理

// 源代码
if (process.env.TARO_ENV === 'weapp') {
  require('./weapp.js')
} else if (process.env.TARO_ENV === 'h5') {
  require('./h5.js')
}

// 编译后(以微信小程序为例)
require('./weapp.js')

依赖分析

  • 建立模块依赖图
  • 识别循环依赖
  • 分析未使用代码
  • 处理动态导入

代码转换阶段

组件转换

// React组件
<View className="container" onClick={handleClick}>
  <Text>Hello</Text>
</View>

// 转换后的微信小程序
<view class="container" bindtap="handleClick">
  <text>Hello</text>
</view>

API转换

// Taro API
Taro.showToast({ title: 'Hello' })

// 转换后(微信小程序)
wx.showToast({ title: 'Hello' })

// 转换后(H5)
Toast.show({ content: 'Hello' })

样式转换

// 源样式
.container {
  display: flex;
  transform: scale(0.5);
  .title {
    font-size: 14px;
  }
}

// 转换后
.container {
  display: -webkit-flex;
  display: flex;
  -webkit-transform: scale(0.5);
  transform: scale(0.5);
}
.container .title {
  font-size: 28rpx;  // 小程序单位转换
}

代码生成阶段

目标平台代码生成

// 生成配置文件(app.json)
{
  "pages": [
    "pages/index/index"
  ],
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#fff"
  }
}

// 生成页面配置(index.json)
{
  "usingComponents": {
    "custom-component": "../../components/custom-component/index"
  }
}

静态资源处理

  • 图片资源转换与优化
  • 字体文件处理
  • 媒体资源处理

运行时处理机制

框架运行时

生命周期映射表

const LIFECYCLE_MAPPING = {
  // React生命周期 -> 小程序生命周期
  componentDidMount: 'onLoad',
  componentDidShow: 'onShow',
  componentDidHide: 'onHide',
  componentWillUnmount: 'onUnload'
}

事件系统处理

// 事件对象标准化
function createEvent(event) {
  const { type, target, currentTarget, detail } = event
  return {
    type,
    target: {
      id: target.id,
      dataset: target.dataset
    },
    currentTarget: {
      id: currentTarget.id,
      dataset: currentTarget.dataset
    },
    detail,
    timestamp: Date.now()
  }
}

组件运行时

组件映射机制

const ComponentsMapping = {
  // React组件 -> 小程序组件
  View: 'view',
  Text: 'text',
  Button: 'button',
  Image: 'image'
}

属性转换处理

function processProps(props) {
  const newProps = {}
  Object.keys(props).forEach(key => {
    // className -> class
    if (key === 'className') {
      newProps.class = props[key]
    }
    // onClick -> bindtap
    else if (key === 'onClick') {
      newProps.bindtap = props[key]
    }
    // style对象处理
    else if (key === 'style' && typeof props[key] === 'object') {
      newProps.style = processStyle(props[key])
    }
    else {
      newProps[key] = props[key]
    }
  })
  return newProps
}

状态管理运行时

状态更新机制

class Store {
  constructor() {
    this.state = {}
    this.observers = new Set()
  }

  setState(newState) {
    this.state = { ...this.state, ...newState }
    this.notify()
  }

  notify() {
    this.observers.forEach(observer => observer(this.state))
  }
}

数据流管理

// Redux集成示例
function connectComponent(Component) {
  return class Connected extends Taro.Component {
    componentDidMount() {
      store.subscribe(this.handleStoreChange)
    }

    handleStoreChange = (state) => {
      this.setState(state)
    }

    render() {
      return <Component {...this.props} {...this.state} />
    }
  }
}

平台差异化处理

API适配层

// API适配示例
const apiDiff = {
  weapp: {
    showToast: wx.showToast,
    getStorage: wx.getStorage
  },
  alipay: {
    showToast: my.showToast,
    getStorage: my.getStorage
  },
  h5: {
    showToast: (options) => Toast.show(options),
    getStorage: (options) => localStorage.getItem(options.key)
  }
}

// 统一调用接口
function callApi(name, options) {
  const api = apiDiff[process.env.TARO_ENV][name]
  return api(options)
}

样式适配处理

// 样式处理函数
function processStyle(style) {
  const { platform } = process.env
  
  // 单位转换
  function transformUnit(value) {
    if (typeof value === 'number') {
      return platform === 'h5' ? `${value}px` : `${value}rpx`
    }
    return value
  }
  
  // 前缀处理
  function addVendorPrefix(property) {
    const needPrefix = ['transform', 'transition', 'animation']
    if (needPrefix.includes(property)) {
      return [
        `-webkit-${property}`,
        `-moz-${property}`,
        `-ms-${property}`,
        property
      ]
    }
    return [property]
  }
  
  return Object.entries(style).reduce((acc, [key, value]) => {
    const properties = addVendorPrefix(key)
    properties.forEach(prop => {
      acc[prop] = transformUnit(value)
    })
    return acc
  }, {})
}

⚠️ 暂不支持的文档区域,【文档小组件】

专家级 】假设让你来做多端开发产品向前端 Leader,简要说明你的评审与设计思路

框架详细分析

Taro 技术栈深度解析

技术优势

  1. React 生态集成

    • 可直接使用 React Hooks、Redux 等熟悉的状态管理方案
    • 支持 React 18 的并发特性
    • 组件逻辑复用方便,自定义 Hooks 能力强大
  2. 多端适配能力

    • 小程序端:支持微信、支付宝、百度、字节等主流小程序平台
    • 移动端:支持 React Native 打包为原生应用
    • Web端:支持 H5 页面,SEO 友好
    • 可通过条件编译实现端特有功能
  3. 开发体验

    • 完善的 TypeScript 支持,类型提示准确
    • 支持 CSS Modules、Sass、Less 等样式方案
    • 开发工具链完善,支持热更新
    • 调试工具友好,支持 Redux DevTools

技术劣势

  1. 性能问题

    • 小程序端 setData 性能瓶颈
    • 复杂列表渲染时性能下降明显
    • 大量动画场景表现不佳
    • 首次加载时间较长
  2. 跨端兼容性

    • 不同端 API 差异需要额外适配
    • 复杂 UI 组件难以复用
    • 样式兼容性问题需要特别处理
    • 三方库兼容性需要评估

Tauri 深度解析

技术优势

  1. 系统资源占用

    • 使用系统 WebView,无需打包 Chromium
    • 运行时内存占用低,通常只有 Electron 的 1/3
    • 最终应用体积小,通常在 10MB 以内
    • 启动速度快,冷启动时间优秀
  2. 安全特性

    • 默认禁止所有特权访问
    • 细粒度的权限控制系统
    • 支持 CSP 策略配置
    • 可配置安全更新策略
  3. 开发特性

    • 支持多种前端框架(React、Vue、Svelte)
    • Rust 后端提供高性能保证
    • IPC 通信性能优秀
    • 支持自定义系统托盘、快捷键等

技术劣势

  1. 平台局限性

    • 仅支持桌面端应用开发
    • 不同操作系统 WebView 存在差异
    • 部分系统 API 访问受限
    • 原生功能扩展需要 Rust 开发能力
  2. 开发成本

    • 需要掌握 Rust 语言开发原生模块
    • 调试流程相对复杂
    • 构建环境配置较麻烦
    • 发布流程需要特别处理

Flutter 深度解析

技术优势

  1. 性能表现

    • 自带渲染引擎,不依赖系统 WebView
    • 支持 60fps 甚至 120fps 的流畅渲染
    • JIT/AOT 双模式编译,开发和生产环境性能都有保证
    • 内存占用可控,GC 性能好
  2. 跨平台能力

    • UI 渲染高度一致性
    • 手势系统完善
    • 动画系统强大
    • 支持自定义平台通道
  3. 开发效率

    • Hot Reload 支持
    • 丰富的开发工具链
    • Widget 测试支持
    • 性能分析工具完善

技术劣势

  1. 学习曲线

    • Dart 语言学习成本
    • Widget 开发思维转换
    • 状态管理概念多
    • 原生功能集成学习成本高
  2. 生态问题

    • 部分领域三方库不够丰富
    • UI 组件需要自行开发
    • 与原生 SDK 集成需要额外开发
    • 版本更新可能带来破坏性改动

React Native 深度解析

技术优势

  1. 生态系统

    • npm 生态支持
    • 大量成熟的 UI 组件库
    • 社区活跃,问题解决方案多
    • 持续有新的优秀组件产出
  2. 开发体验

    • Fast Refresh 支持
    • 可以使用熟悉的 Web 开发工具
    • TypeScript 支持完善
    • 调试工具链完善
  3. 性能表现

    • 新架构(Fabric)显著提升性能
    • 支持并发特性
    • 手势系统性能好
    • 支持性能监控

技术劣势

  1. 框架限制

    • 布局系统与 Web 存在差异
    • 样式能力有限
    • 原生模块开发复杂
    • 动画性能优化难度大
  2. 维护成本

    • 版本升级经常遇到兼容性问题
    • 需要维护原生代码
    • 依赖版本管理复杂
    • Debug 难度较大

架构设计实践建议

技术选型决策矩阵

  1. 业务维度评估

    • 复杂度评估:

      • 低复杂度(CMS、资讯):推荐 Taro
      • 中复杂度(电商、社交):推荐 React Native
      • 高复杂度(专业工具、游戏):推荐 Flutter
  • 性能要求:

    • 普通需求:Taro/React Native 足够
    • 高性能需求:Flutter 更适合
    • 极致性能:考虑原生开发
  • 跨平台一致性:

    • 要求高:Flutter
    • 要求中:React Native
    • 要求低:Taro
  1. 团队维度评估

    • 技术栈匹配度:

      • React 团队:Taro/React Native
      • 全新技术栈:Flutter 值得投资
      • 桌面端:Tauri 更轻量
  • 开发效率要求:

    • 快速验证:Taro
    • 中长期项目:Flutter/React Native
    • 桌面应用:Tauri

架构设计关键点

  1. 分层架构设计
表现层(UI Components)
│
业务层(Business Logic)
│
数据层(Data Management)
│
基础层(Network/Storage/Native)

每一层的具体职责:

  • 表现层:

    • 负责 UI 渲染和用户交互
    • 处理页面路由
    • 管理局部状态
    • 实现动画效果
  • 业务层:

    • 实现业务逻辑
    • 处理数据转换
    • 管理全局状态
    • 处理业务事件
  • 数据层:

    • 数据持久化
    • 缓存策略
    • 数据同步
    • 状态管理
  • 基础层:

    • 网络请求
    • 本地存储
    • 原生能力调用
    • 公共工具方法
  1. 跨端适配策略

平台差异化处理方案:

// 策略模式处理平台差异
interface PlatformStrategy {
  handleShare(): void;
  handlePay(): void;
  handleStorage(): void;
}

class AndroidStrategy implements PlatformStrategy {
  handleShare() {
    // Android 分享实现
  }
  // ...其他方法实现
}

class IOSStrategy implements PlatformStrategy {
  handleShare() {
    // iOS 分享实现
  }
  // ...其他方法实现
}

// 使用工厂方法创建策略
const platform = Platform.select({
  ios: new IOSStrategy(),
  android: new AndroidStrategy(),
  default: new WebStrategy(),
});
  1. 性能优化方案

首屏加载优化:

// 路由级别代码分割
const HomeScreen = React.lazy(() => import('./screens/Home'));
const ProfileScreen = React.lazy(() => import('./screens/Profile'));

// 预加载关键路由
const preloadRoutes = () => {
  const routes = ['/home', '/profile'];
  routes.forEach(route => {
    const link = document.createElement('link');
    link.rel = 'prefetch';
    link.href = route;
    document.head.appendChild(link);
  });
};

具体实践建议

  1. 工程化规范

    • 统一的代码风格(ESLint + Prettier)
    • Git 提交规范(Conventional Commits)
    • 自动化测试流程
    • CI/CD 配置
  2. 监控体系

    • 性能监控
    • 错误监控
    • 用户行为分析
    • 业务数据监控
  3. 发布策略

    • 灰度发布机制
    • 热更新策略
    • 回滚机制
    • 版本管理规范

框架选择决策建议

  1. 选择 Taro 的场景

    • 主要面向内容展示和简单交互
    • 团队已有 React 技术储备
    • 需要快速验证市场
    • 对性能要求不是特别高
  2. 选择 Flutter 的场景

    • 需要复杂的交互和动画
    • 追求极致的性能体验
    • 团队愿意投入学习新技术
    • 产品需要高度一致的跨平台体验
  3. 选择 React Native 的场景

    • 中等复杂度的应用
    • 团队擅长 React 开发
    • 需要较好的性能和原生体验
    • 已有 Web 端产品需要复用代码
  4. 选择 Tauri 的场景

    • 专注于桌面端应用
    • 需要轻量级的解决方案
    • 对安全性有较高要求
    • 团队有 Rust 开发能力

简历优化(35K+ 简历模板)

技能描述

  • 熟练掌握 HTML、CSS、JavaScript、Typescript 以及 OOP、FP、 AOP 等设计思想

  • 掌握样式体系构建与落地,对 css 预编译、css in js、module css 以及 utility-first CSS 有深入研究,并从零改良过样式体系以支持 SSR、SSG

  • 熟悉 React、Vue 相关技术栈,熟悉 React、Vue 及相关技术框架的实现原理

  • 掌握构建工具 Webpack、Vite 等,掌握编译工具 Babel,并深入理解其原理,并参与 Rspack 构建

  • 丰富的数据可视化经验,熟悉 Canvas、svg 开发范式,理解 Echarts、Antv 原理,能根据业务需求基于 d3、zrender 开发自定义渲染引擎

  • 丰富的跨端开发经验,熟练使用 Taro、Flutter、React-Native 开发跨端应用,对构建 hybird App 有丰富经验,深入理解跨端开发编译原理

  • 基于 Node.js 开发脚手架、打包构建优化工具及中间件服务

  • 掌握常用设计模式、算法与安全知识,追求开发高质量、高可维护性代码,追求极致产品体验

  • 团队管理经验,并在项目架构设计与性能优化方面具有丰富经验

  • 算法与编程技术

    • 精通各种算法题的分类及解决方法,包括排序与查找、数据结构、动态规划、贪心算法、回溯算法、分治算法、图论算法、数学算法等。
    • 重点掌握动态规划的基本概念、解题步骤和经典题目。
  • 3D 数字孪生平台开发经验

    • 熟练使用 WebGL 和 WebAssembly 技术,开发高效的 3D 渲染引擎。
    • 精通正射影像和倾斜摄影技术,具备 Tile 和模型(包括白膜和精模)的处理经验,能够使用 Blender 进行模型制作。
    • 熟悉材质、光效和粒子系统的实现与优化。
  • 全面性能优化能力

    • 具备打包构建优化经验,熟练使用 Webpack 进行模块打包,掌握 chunk、treeshaking、happypack、cache-loader 等优化技巧,并使用 Webpack Module Federation 进行模块联邦管理。
    • 精通资源优化,能够有效进行图片、字体压缩,管理请求队列,并通过 OSS 和 CDN 提升资源加载速度。
    • 具有应用性能优化经验,包括数据结构优化和应用模块更新。
    • 深入了解缓存机制,熟悉强缓存(Expiration、Cache-Control)、协商缓存(Etag)和策略缓存(Service-Worker)的配置与管理。

项目描述

这个环节至关重要,很多同学不重视,简历随便写一写就开始投递了,结果投出去几百份可能一家公司面试都没有,结果就在怀疑前端行情出问题了

STAR 法则:

  • 遇到了什么问题 question,需求
  • 怎么评估解决方案,方案对比,方案落地 react 状态管理(redux、mobx、jotai、recoil)Vue3 -> Pinia
  • 具体方案落地
  • 结果反思,细节优化思考

大家先看这段描述:

技术栈:Java、Vue2、echarts、WEui、BaiduMap、JavaScript 、HTTP数据库:MySQL管理工具:SVN

责任描述:

1)产品前端研发负责人,主要负责整体样式沟通,样式调配实现;门户、管理平台、移动端、智端、可视化等前端内容实现;

2)实现组织管理、人员管理、党员关系转接、待办通知、绩效考核(复杂功能算法实现)、发展党员(25个流程)、可视化等主体功能,兼容性优化、适配1920*1080屏幕以及响应式布局实现;

3)相关功能开发,包含前后端、数据库;

4)门户框架搭建、门户整体设计、后端接口、门户前端 UI 实现等;

5)微信小程序框架搭建、小程序页面设计及开发、知识图谱技术预演;

6 )项目经理工作辅助,包含需求沟通、UI设计沟通、交付材料项目经历整理、前端代码质量管理、部分功能设计。

深度优化一下

工作内容和成果

  • 架构设计 】参与智慧管理平台整体架构设计、技术选型与方案评审,担任全栈开发,完成相关核心模块
  • 企微开发 】对接企业微信生态,基于企微 SDK 完成平台支付、消息推送、机器人等功能开发
  • 可视化 】主导完成平台可视化渲染引擎(可视化图表的组件,数据协议)设计与开发,基于 echarts (svgRenderer、canvasRenderer 一千万行数据的表格渲染【不能使用 虚拟滚动 】 canvas table,chunk)封装业务图表库,服务于平台可视化场景
  • 地图开发 】使用百度地图 SDK,封装业务地图渲染器(MapRenderer),包含:地图撒点、地区数据下钻等功能
  • 小程序与App 】基于 uniapp 实现智慧党建用户端多端开发落地,产物编译为 H5、微信小程序两端应用
  • 团队基建 】推进团队业务组件库、图表库与基础库沉淀,完成 10+ 个业务组件沉淀,以此提升了团队协同开发效率
  • 优化 】设计产品响应式系统,基于 media query 设计响应式端点规则,适配不同端应用的展示
  • 自研 OA 打通 】...

STAR

【技术栈】

  • Java、Vue2、ECharts、WEui、BaiduMap、JavaScript、HTTP
  • 数据库 :MySQL
  • 管理工具 :SVN

【产品前端研发负责人】

  • 情境 (Situation) :担任产品前端研发负责人,负责门户、管理平台、移动端、智端、可视化等前端内容的实现。
  • 任务 (Task) :主要任务是与设计团队沟通,调配和实现整体样式,确保产品界面的一致性和用户体验。
  • 行动 (Action) :我协调设计与开发团队,定期召开样式沟通会,亲自进行样式的调配与实现,并负责不同平台和设备的前端内容开发。
  • 结果 (Result) :成功实现了多个平台的前端开发工作,提升了产品的用户体验和一致性,获得了团队和用户的高度评价。

【实现复杂功能及优化】

  • 情境 (Situation) :项目需要实现复杂功能算法和大规模功能模块,包括组织管理、人员管理、党员关系转接、待办通知、绩效考核、发展党员(25个流程)和可视化功能。
  • 任务 (Task) :负责上述复杂功能的实现,并优化其兼容性和响应式布局。
  • 行动 (Action) :通过设计和实现复杂算法,确保各模块的功能性;进行兼容性优化,使系统适配1920*1080屏幕和响应式布局。
  • 结果 (Result) :成功实现并优化了所有复杂功能,系统在不同设备和分辨率下均表现良好,提高了用户操作的流畅度和满意度。

【全面功能开发】

  • 情境 (Situation) :需要进行前后端和数据库的全面开发,确保系统各功能模块的无缝集成。
  • 任务 (Task) :开发和实现相关功能,包括前端UI、后端接口和数据库交互。
  • 行动 (Action) :采用Java、Vue2等技术,开发并调试各功能模块,与后端团队密切合作,确保接口的准确性和数据的一致性。
  • 结果 (Result) :成功完成了所有功能模块的开发和集成,系统运行稳定,性能优异,受到了客户的好评。

【微信小程序开发与知识图谱预演】

  • 情境 (Situation) :项目需要开发微信小程序,并进行知识图谱技术的预演。
  • 任务 (Task) :负责小程序框架的搭建、页面设计及开发,同时进行知识图谱的技术预演。
  • 行动 (Action) :使用WEui、JavaScript等技术,设计并开发小程序页面,进行知识图谱的技术预演和验证。
  • 结果 (Result) :成功搭建了微信小程序框架,完成了页面设计和开发工作,知识图谱技术预演顺利,通过了技术验证。

【项目经理工作辅助】

  • 情境 (Situation) :在项目中辅助项目经理,确保项目需求沟通顺畅,UI设计协调到位,交付材料齐全,前端代码质量高。
  • 任务 (Task) :辅助项目经理进行需求沟通、UI设计沟通、交付材料整理、前端代码质量管理以及部分功能设计。
  • 行动 (Action) :积极参与需求和UI设计的沟通,整理和管理项目交付材料,进行代码审查和质量管理,并参与功能设计。
  • 结果 (Result) :成功辅助项目经理完成了项目的各项工作,提高了项目的开发效率和交付质量,确保了项目的顺利进行。

其实还不够,这些项目才是求职香饽饽

你可能不具备这些项目的实战经验,很多同学写了很多年管理系统,简单增删改查项目,如果不跳出这个圈子,很难在薪资上有非常大的突破!

  • 大厂 UI 组件库(Vue3)整体设计与开发实践(monorepo 架构)

  • 大厂业务 Hooks 库(React 18)整体设计与开发实践(从零到一的架构、规范流程)

  • 企业级脚手架工具开发实践

  • 企业级文档编辑器飞书文档开发实践

  • 前端性能、异常与行为监控

  • 3D 可视化数字孪生低代码实战 💥

    • 基于 cesium(arcGis、超图) 方案的 WebGIS 开发实践
    • 基于 openlayer、mapbox 开发
    • 基于 WebGL 3D 可视化开发实践

年包 50W+ 薪资长线规划

核心要素

  1. 全面的技术储备

    1. 框架基础

      • Vue 和 React 经验:包括 Vue3 + Typescript 和 React18(Hooks、Concurrent)
      • 掌握框架原理:React 生态库(React-Router、Redux)和 Vue 生态库原理
    2. 工程化能力

      • 构建工具:Webpack、Vite、Rspack、ESBuild、swc
      • CI/CD 自动化:自动化构建和自动化部署
    3. 基建能力

      • Node.js、命令行工具开发(Cli)
      • UI 库、图表库、工具库开发
    4. 业务领域经验

      • 管理系统和图表类应用
      • 可视化、编辑器、云表格、低代码平台、SaaS 产品、数字孪生、三维可视化
  2. 项目经验

    • 参与过至少两个大型项目,并主导过一个复杂项目
    1. 管理系统:包括项目搭建、技术方案选择、技术栈构建、CI/CD 流程
    2. 其他领域项目:如可视化、编辑器、云表格、低代码平台、SaaS 产品、数字孪生、三维可视化
  3. 面试表现

    1. 个人介绍

      • 准备个人介绍草稿,涵盖基本信息、技术栈和项目重难点
    2. STAR 法则

      • 问题描述:阐述遇到的问题或需求
      • 解决方案评估:方案对比与选择(如 React 状态管理:redux、mobx、jotai、recoil,Vue3 使用 Pinia)
      • 方案实施:具体的实施步骤
      • 反思与优化:项目反思及优化建议
    3. 面试准备

      • 重点复习知识点:如 v8 内存管理、Promise A+ 规范、事件循环、this、面向对象编程原型
      • 技术储备:结合项目经验展示技术在项目中的应用
  4. 学历提升

    1. 现有学历:大专
    2. 未来计划:尽快取得本科证书(不需要注明具体年限)
    3. 学历背景:民办学校
    4. 内推建议:应对学历和工作经历问题,通过内推提升机会

补足短板

  • 项目简单,管理后台一做就是大半年,天天 CRUD

    • 看开源项目(react-hook-form ts 类型、hook 处理、状态管理、架构 Provider,keyPath)
    • 找一些不错的项目练手
    • 拿好的项目,学习完放在简历里, 可视化、编辑器、云表格、低代码、SaaS 产品、数字孪生、三维可视化
    • 1.自研:15K, 2.外包:20K ,这个火坑, 灰(供需决定)
  • 技术栈掌握不深不广,只会用 Vue2 (Vue3 + Typescript),React18(React stack reconciler)

  • 架构、方案设计没碰过

    • React,create-react-app、umi,没有真正从零到一去设计初始化过一个项目
    • Vue,Vue CLI,Vite/Webpack。Vue2 CLI 创出来项目 1. webpack、2.vite
  • 没有专精的技能或业务

    • 自驱 (假定自己是 Leader),项目的赢利点、商业价值【 可视化、编辑器、白板、团队基建、AI产品
    • 与生俱来有些东西,好奇心、自驱力、清晰规划
    • 我:管理平台,HPE(官网、后台管理),云表格(维格表、飞书云表格)、云编辑器(CKEditor 老【html string】)(语雀、【石墨文档】)

妙码学院——全程陪跑、督学、内推

⚠️ 暂不支持的文档区域,【文档小组件】

  • 跨端开发 Taro(Taro 编译器 compiler、运行时 runtime)、uniapp
  • 协同编辑器(文档类、画板类)wangEditor、CKEditor
  • 团队基建工程(UI 库、图表库、Cli -> 产生产物 npm 包)
  • 3D 可视化数字孪生 bigdata
  • 低代码平台

课程体系 2.0 升级,除了基础知识夯实,融入了更多项目实战内容,包含:

  • 企业级脚手架工具开发实践

  • 企业级文档编辑器飞书文档开发实践

  • 大厂 UI 组件库(Vue3)整体设计与开发实践

  • 大厂业务 Hooks 库(React 18)整体设计与开发实践

  • 埋点与数据监控平台实战

  • 3D 可视化数字孪生实战 💥

    • 基于 cesium 方案的 WebGIS 开发实践
    • 基于 WebGL 3D 可视化开发实践

妙码学院全网独家项目实战矩阵

所有项目实战,均完全 从零到一手写纯原创 ,项目架构与编码规范真一线大厂级。

  • 微前端在分拆原子应用场景下的落地与实践

  • 协同编辑器从零到一架构实现

  • 推动团队基建落地

    • React UI 库
    • Vue Composition API 库
    • 企业级脚手架
  • 数字孪生平台整体架构设计

  • 企业级无代码可视化平台实践(Vue3)

  • 低代码平台设计与实现

    • 编排引擎
    • 流程引擎
    • 编辑器
    • 代码执行器与 JavaScript 沙箱
  • 用户行为分析 SDK 及监控可视化整体实现

  • 可视化渲染引擎设计与实现

  • 基于 RAG / Agent 前端 AI 应用流程编排平台

不同阶段对前端人的硬性要求

以下是对您提供的内容进行权威和专业化改写的建议:

1~3年

在此阶段,重点在于评估个人的基础知识和热情。对前端基础、计算机原理、网络通信和算法等领域的要求较高。由于在此阶段难以评估业务深度,因此更多关注基础知识的掌握程度。

  • 关键在于通过学术教育或网络资源加强基础知识;
  • 在简历中以多种方式展示对前端的热情,展现个人潜力;
  • 积极探索前沿技术,关注国内外技术动态;
  • 尝试开发小型项目或参与社区开源项目;
  • 建立技术博客,以输出促进知识吸收。

3~5年

此阶段通常是向成为独立工程师发展的关键时期,避免重复使用有限的经验。

  • 关注社区中关于进阶的资料和路线,强化基础知识;

  • 深入掌握常用框架的高级用法,探索其原理;

  • 在业务开发中不仅完成功能,还需考虑项目结构设计、封装基础工具、设计和开发基础组件;

  • 思考提高团队效率的方法,例如:

    • 集成代码检验和风格统一插件(如 eslint、stylelint、prettier、spellcheck);
    • 从工程化角度提高本地开发效率,优化webpack构建,探索esbuild、vite等工具;
    • 对于多项目开发,整理差异和统一部分,建立内部脚手架以减少重复工作;
    • 尝试搭建CI/CD平台,维护公司内部的通用npm包;
    • 培养软技能,如沟通协作,协调各角色共同推进目标。

5年以上

进入此阶段,可能朝技术专家或管理方向发展。期望您能够独立负责高复杂度项目,突破关键技术难题。

  • 负责技术调研,关注行业趋势,选择最优技术方案,具备决策能力;
  • 拥有丰富的技术经验和技术储备,能够解决遇到的困难,并有自己的方法论;
  • 协助或主导业务目标制定,合理推动项目达成预期效果;
  • 是否具有团队领导经验,能够协调跨团队项目,处理团队成员情绪问题,解决技能分布不平衡等问题;
  • 打造技术氛围,促进团队共同成长。

职业规划指导

评论区选取三位同学互动,其他同学也可以联系咨询老师,文字方式提供辅导解答。

【未知组件reminder】