⚠️温馨提示: 文档中包含【7个】暂不支持的区域,请通过搜索关键字【暂不支持的文档区域】进行后续处理
很多同学可能第一次来,我分享了很多干货公开课,希望对你的技术成长有帮助!免费分享都在这里,需要 文档和配套视频找咨询老师 领取~
【飞书文档】备战金九银十,进阶大前端,涨薪全突破! 跳槽涨薪需求同学必看
【飞书文档】面试被算法干吐了?字节大佬带你突破极限,冲击 30K+ 必掌握算法与 WebAssembly 技术 冲刺年包 50W+ 同学必看
【飞书文档】高级前端专家如何做性能优化?特邀字节大佬细数飞书应用优化细节【超详细内培版】
【飞书文档】高级前端专家如何做项目架构与工程化设计? 特邀字节大佬细数字节开源项目架构细节【超详细内培版】
【飞书文档】小小微前端,轻松拿捏,特邀字节大佬开讲微前端架构与源码剖析【内部培训版】 35K+ 同学必看
【飞书文档】高级前端专家如何做性能优化?特邀字节大佬细数飞书应用优化细节(二)【内部培训版】
【飞书文档】前端破局 AI 应用开发,特邀字节大佬分享字节系 AI 场景落地应用与 AI 引擎编排流程 探索前端新方向同学福音
【飞书文档】React18 源码深度剖析,字节面试官教你轻松拿捏高级前端专家面试框架原理题
【飞书文档】Vue3 源码深度剖析,字节面试官教你轻松拿捏高级前端专家面试框架原理题
【飞书文档】Vite 构建过程与源码深度剖析,你怎么也想不到一线大厂工程化构建面试会问这么深!
【飞书文档】脚手架/CLI 工具原理与开发实践,特邀字节前端专家带你体悟大厂团队基建与研发工作流 团队基建必看
【飞书文档】Webpack 原理深度解读与面试专项突击,字节面试官带你手撕难缠打包构建面试原理题 工程化与构建原理深入
【飞书文档】冲击中大厂筹备与涨薪突击最优方案,特邀字节面试官带你体验大厂面试全流程
【飞书文档】字节面试专场——中厂在职学员冲击大厂 30K+,看看面试官如何评价 大厂模拟面试,问得很深慎看
【飞书文档】前端性能与异常监控平台全链路设计与实践,字节架构师:掌握这整套拿个 40K+ 不在话下吧
【飞书文档】飞书文档协同编辑器技术揭秘,特邀字节架构师分享富文本编辑器方案细节
【飞书文档】大数据可视化引擎与数字孪生平台设计浅析,字节架构师:一起来剖析 DataWind 数据洞察平台架构之道
【飞书文档】服务端渲染(SSR)与前后端同构技术原理揭秘,字节前端专家带你光速进阶全栈 进阶必学
【飞书文档】Babel 与编译原理详解,字节高级前端专家带你从零实现飞书表格公式执行器
【飞书文档】Nest 服务端开发与原理深度剖析,《NestJS 实战》作者带你领略框架设计之美 全栈进阶,企业级框架
- 多端开发核心原理
- 多端框架编译与运行时处理细则
- 移动端与桌面端多端开发方案设计与实践,多端差异抹平
- 【 初中级 】多端开发了解过吗?说说 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>
)
}
核心概念
跨端开发方案
多端同构
- 统一的组件规范
- 统一的 API 规范
- 统一的路由规范
条件编译
if (process.env.TARO_ENV === 'weapp') {
// 微信小程序特有代码
} else if (process.env.TARO_ENV === 'h5') {
// H5 特有代码
}
生命周期
- 应用生命周期
class App extends Component {
componentDidMount() {}
componentDidShow() {}
componentDidHide() {}
}
- 页面生命周期
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
多端开发编译与运行时处理详解
编译流程
代码解析阶段
- 解析 JSX/TSX 代码
- 处理条件编译
- 分析依赖关系
代码转换阶段
- 组件转换
- API 转换
- 样式转换
代码生成阶段
- 生成目标平台代码
- 处理静态资源
- 生成项目配置文件
运行时处理
框架运行时
- 生命周期映射
- 事件系统处理
- 状态管理适配
组件运行时
- 组件映射
- 属性转换
- 事件处理
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 技术栈深度解析
技术优势
React 生态集成
- 可直接使用 React Hooks、Redux 等熟悉的状态管理方案
- 支持 React 18 的并发特性
- 组件逻辑复用方便,自定义 Hooks 能力强大
多端适配能力
- 小程序端:支持微信、支付宝、百度、字节等主流小程序平台
- 移动端:支持 React Native 打包为原生应用
- Web端:支持 H5 页面,SEO 友好
- 可通过条件编译实现端特有功能
开发体验
- 完善的 TypeScript 支持,类型提示准确
- 支持 CSS Modules、Sass、Less 等样式方案
- 开发工具链完善,支持热更新
- 调试工具友好,支持 Redux DevTools
技术劣势
性能问题
- 小程序端 setData 性能瓶颈
- 复杂列表渲染时性能下降明显
- 大量动画场景表现不佳
- 首次加载时间较长
跨端兼容性
- 不同端 API 差异需要额外适配
- 复杂 UI 组件难以复用
- 样式兼容性问题需要特别处理
- 三方库兼容性需要评估
Tauri 深度解析
技术优势
系统资源占用
- 使用系统 WebView,无需打包 Chromium
- 运行时内存占用低,通常只有 Electron 的 1/3
- 最终应用体积小,通常在 10MB 以内
- 启动速度快,冷启动时间优秀
安全特性
- 默认禁止所有特权访问
- 细粒度的权限控制系统
- 支持 CSP 策略配置
- 可配置安全更新策略
开发特性
- 支持多种前端框架(React、Vue、Svelte)
- Rust 后端提供高性能保证
- IPC 通信性能优秀
- 支持自定义系统托盘、快捷键等
技术劣势
平台局限性
- 仅支持桌面端应用开发
- 不同操作系统 WebView 存在差异
- 部分系统 API 访问受限
- 原生功能扩展需要 Rust 开发能力
开发成本
- 需要掌握 Rust 语言开发原生模块
- 调试流程相对复杂
- 构建环境配置较麻烦
- 发布流程需要特别处理
Flutter 深度解析
技术优势
性能表现
- 自带渲染引擎,不依赖系统 WebView
- 支持 60fps 甚至 120fps 的流畅渲染
- JIT/AOT 双模式编译,开发和生产环境性能都有保证
- 内存占用可控,GC 性能好
跨平台能力
- UI 渲染高度一致性
- 手势系统完善
- 动画系统强大
- 支持自定义平台通道
开发效率
- Hot Reload 支持
- 丰富的开发工具链
- Widget 测试支持
- 性能分析工具完善
技术劣势
学习曲线
- Dart 语言学习成本
- Widget 开发思维转换
- 状态管理概念多
- 原生功能集成学习成本高
生态问题
- 部分领域三方库不够丰富
- UI 组件需要自行开发
- 与原生 SDK 集成需要额外开发
- 版本更新可能带来破坏性改动
React Native 深度解析
技术优势
生态系统
- npm 生态支持
- 大量成熟的 UI 组件库
- 社区活跃,问题解决方案多
- 持续有新的优秀组件产出
开发体验
- Fast Refresh 支持
- 可以使用熟悉的 Web 开发工具
- TypeScript 支持完善
- 调试工具链完善
性能表现
- 新架构(Fabric)显著提升性能
- 支持并发特性
- 手势系统性能好
- 支持性能监控
技术劣势
框架限制
- 布局系统与 Web 存在差异
- 样式能力有限
- 原生模块开发复杂
- 动画性能优化难度大
维护成本
- 版本升级经常遇到兼容性问题
- 需要维护原生代码
- 依赖版本管理复杂
- Debug 难度较大
架构设计实践建议
技术选型决策矩阵
业务维度评估
复杂度评估:
- 低复杂度(CMS、资讯):推荐 Taro
- 中复杂度(电商、社交):推荐 React Native
- 高复杂度(专业工具、游戏):推荐 Flutter
性能要求:
- 普通需求:Taro/React Native 足够
- 高性能需求:Flutter 更适合
- 极致性能:考虑原生开发
跨平台一致性:
- 要求高:Flutter
- 要求中:React Native
- 要求低:Taro
团队维度评估
技术栈匹配度:
- React 团队:Taro/React Native
- 全新技术栈:Flutter 值得投资
- 桌面端:Tauri 更轻量
开发效率要求:
- 快速验证:Taro
- 中长期项目:Flutter/React Native
- 桌面应用:Tauri
架构设计关键点
- 分层架构设计
表现层(UI Components)
│
业务层(Business Logic)
│
数据层(Data Management)
│
基础层(Network/Storage/Native)
每一层的具体职责:
表现层:
- 负责 UI 渲染和用户交互
- 处理页面路由
- 管理局部状态
- 实现动画效果
业务层:
- 实现业务逻辑
- 处理数据转换
- 管理全局状态
- 处理业务事件
数据层:
- 数据持久化
- 缓存策略
- 数据同步
- 状态管理
基础层:
- 网络请求
- 本地存储
- 原生能力调用
- 公共工具方法
- 跨端适配策略
平台差异化处理方案:
// 策略模式处理平台差异
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(),
});
- 性能优化方案
首屏加载优化:
// 路由级别代码分割
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);
});
};
具体实践建议
工程化规范
- 统一的代码风格(ESLint + Prettier)
- Git 提交规范(Conventional Commits)
- 自动化测试流程
- CI/CD 配置
监控体系
- 性能监控
- 错误监控
- 用户行为分析
- 业务数据监控
发布策略
- 灰度发布机制
- 热更新策略
- 回滚机制
- 版本管理规范
框架选择决策建议
选择 Taro 的场景
- 主要面向内容展示和简单交互
- 团队已有 React 技术储备
- 需要快速验证市场
- 对性能要求不是特别高
选择 Flutter 的场景
- 需要复杂的交互和动画
- 追求极致的性能体验
- 团队愿意投入学习新技术
- 产品需要高度一致的跨平台体验
选择 React Native 的场景
- 中等复杂度的应用
- 团队擅长 React 开发
- 需要较好的性能和原生体验
- 已有 Web 端产品需要复用代码
选择 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+ 薪资长线规划
核心要素
全面的技术储备
框架基础
- Vue 和 React 经验:包括 Vue3 + Typescript 和 React18(Hooks、Concurrent)
- 掌握框架原理:React 生态库(React-Router、Redux)和 Vue 生态库原理
工程化能力
- 构建工具:Webpack、Vite、Rspack、ESBuild、swc
- CI/CD 自动化:自动化构建和自动化部署
基建能力
- Node.js、命令行工具开发(Cli)
- UI 库、图表库、工具库开发
业务领域经验
- 管理系统和图表类应用
- 可视化、编辑器、云表格、低代码平台、SaaS 产品、数字孪生、三维可视化
项目经验
- 参与过至少两个大型项目,并主导过一个复杂项目
- 管理系统:包括项目搭建、技术方案选择、技术栈构建、CI/CD 流程
- 其他领域项目:如可视化、编辑器、云表格、低代码平台、SaaS 产品、数字孪生、三维可视化
面试表现
个人介绍
- 准备个人介绍草稿,涵盖基本信息、技术栈和项目重难点
STAR 法则
- 问题描述:阐述遇到的问题或需求
- 解决方案评估:方案对比与选择(如 React 状态管理:redux、mobx、jotai、recoil,Vue3 使用 Pinia)
- 方案实施:具体的实施步骤
- 反思与优化:项目反思及优化建议
面试准备
- 重点复习知识点:如 v8 内存管理、Promise A+ 规范、事件循环、this、面向对象编程原型
- 技术储备:结合项目经验展示技术在项目中的应用
学历提升
- 现有学历:大专
- 未来计划:尽快取得本科证书(不需要注明具体年限)
- 学历背景:民办学校
- 内推建议:应对学历和工作经历问题,通过内推提升机会
补足短板
项目简单,管理后台一做就是大半年,天天 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】
