React Native 全栈开发实战:从零构建移动端应用
《一条龙开发指南:MCP AI Agent 理论+项目实战开发你的MCP Server》
🧑💻 面试人物设定
- 姓名: 陈宇航
- 年龄: 28 岁
- 学历: 计算机本科
- 工作年限: 4 年
- 公司背景: 某头部社交平台
- 技术栈: React Native, Expo, Apollo GraphQL, Node.js, PostgreSQL
- 核心职责:
- 使用 React Native 开发跨平台 App
- 利用 Expo 提升开发效率
- 接入 Apollo GraphQL 实现实时数据同步
- 构建 Node.js 后端服务
- 工作成果:
- 成功上线多个功能模块,用户活跃度提升 30%
- 将 App 包体积缩小至 15MB 内
🎤 第一轮面试:React Native 基础考察
面试官: “你好,请介绍一下你最近参与的 React Native 项目。”
程序员: “您好!我最近主要负责一个社交 App 的重构,使用 React Native 实现跨平台统一开发,结合 Expo 快速搭建 UI,并接入 Apollo GraphQL 实现实时数据更新。”
面试官: “你能写一个简单的页面跳转逻辑吗?”
程序员: “当然可以,比如从首页跳转到详情页。”
// App.js
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import HomePage from './HomePage';
import DetailPage from './DetailPage';
const Stack = createStackNavigator();
export default function App() {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomePage} />
<Stack.Screen name="Detail" component={DetailPage} />
</Stack.Navigator>
</NavigationContainer>
);
}
🧠 第二轮面试:Expo 项目搭建
面试官: “你是怎么使用 Expo 的?”
程序员: “我们会使用 Expo CLI 创建项目,并利用内置 API 实现原生功能。”
# 安装 Expo CLI
npm install -g expo-cli
# 创建新项目
expo init MySocialApp
# 运行项目
npm start
// 使用 Expo Camera API
import { Camera } from 'expo-camera';
export default function CameraScreen() {
const [hasPermission, setHasPermission] = useState(null);
useEffect(() => {
(async () => {
const { status } = await Camera.requestCameraPermissionsAsync();
setHasPermission(status === 'granted');
})();
}, []);
if (hasPermission === null) return <View />;
if (hasPermission === false) return <Text>No access to camera</Text>;
return <Camera style={{ flex: 1 }} />;
}
⚙️ 第三轮面试:Apollo GraphQL 集成
面试官: “你们是怎么接入 GraphQL 的?”
程序员: “我们使用 Apollo Client 实现本地状态管理与远程数据同步。”
// ApolloClient.js
import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client';
import { setContext } from '@apollo/client/link/context';
const httpLink = createHttpLink({
uri: 'http://localhost:4000/graphql',
});
const authLink = setContext((_, { headers }) => {
// 获取 token
const token = localStorage.getItem('token');
return {
headers: {
...headers,
authorization: token ? `Bearer ${token}` : "",
}
};
});
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache(),
});
export default client;
// 查询用户信息
import { gql, useQuery } from '@apollo/client';
const GET_USER = gql`
query GetUser($id: ID!) {
user(id: $id) {
id
name
email
}
}
`;
function UserProfile({ userId }) {
const { loading, error, data } = useQuery(GET_USER, {
variables: { id: userId },
});
if (loading) return <Text>Loading...</Text>;
if (error) return <Text>Error: {error.message}</Text>;
return (
<View>
<Text>{data.user.name}</Text>
<Text>{data.user.email}</Text>
</View>
);
}
📊 第四轮面试:Node.js 后端服务开发
面试官: “你是怎么构建后端服务的?”
程序员: “我们使用 Express + Apollo Server 构建 GraphQL 服务,并结合 PostgreSQL 实现数据持久化。”
// server.js
const { ApolloServer, gql } = require('apollo-server-express');
const { Pool } = require('pg');
const typeDefs = gql`
type User {
id: ID!
name: String!
email: String!
}
type Query {
users: [User]
user(id: ID!): User
}
type Mutation {
createUser(name: String!, email: String!): User
}
`;
const resolvers = {
Query: {
users: async () => {
const result = await pool.query('SELECT * FROM users');
return result.rows;
},
user: async (_, { id }) => {
const result = await pool.query('SELECT * FROM users WHERE id = $1', [id]);
return result.rows[0];
},
},
Mutation: {
createUser: async (_, { name, email }) => {
const result = await pool.query(
'INSERT INTO users (name, email) VALUES ($1, $2) RETURNING *',
[name, email]
);
return result.rows[0];
},
},
};
const server = new ApolloServer({ typeDefs, resolvers });
await server.start();
server.applyMiddleware({ app });
// 启动服务
app.listen(4000, () => {
console.log('Server running on http://localhost:4000');
});
📈 第五轮面试:App 打包与发布
面试官: “你是怎么打包并发布 React Native App 的?”
程序员: “我们主要使用 Expo 构建命令进行打包,并上传到 Google Play 和 Apple App Store。”
# Android 打包
expo build:android --release-channel staging
# iOS 打包
expo build:ios --release-channel staging
然后我们会将 .apk
或 .ipa
文件上传到 Google Play 或 Apple App Store,并配置自动更新策略。
💬 结尾环节
面试官: “今天的面试就到这里,我们会综合评估你的表现,后续 HR 会联系你。”
程序员: “谢谢您今天的时间,期待有机会加入贵公司。”