然后,使用 Webpack,指定为 template HTML,并配置 dev server,注意一定要配置 headers,不然会有跨域的问题,子应用同理:
// webpack.config.js
const HtmlWebpackPlugin = require(‘html-webpack-plugin’);
module.exports = {
entry: ‘./index.js’,
devtool: ‘source-map’,
devServer: {
open: true,
port: ‘7099’,
clientLogLevel: ‘warning’,
disableHostCheck: true,
compress: true,
headers: {
‘Access-Control-Allow-Origin’: ‘*’,
},
historyApiFallback: true,
overlay: { warnings: false, errors: true },
},
output: {
publicPath: ‘/’,
},
mode: ‘development’,
resolve: {
extensions: [‘.js’, ‘.jsx’, ‘.ts’, ‘.tsx’],
},
module: {
rules: [
{
test: /.jsx?$/,
exclude: /node_modules/,
use: {
loader: ‘babel-loader’,
options: {
presets: [‘@babel/preset-env’],
plugins: [‘@babel/plugin-transform-react-jsx’],
},
},
},
{
test: /.(le|c)ss$/,
use: [‘style-loader’, ‘css-loader’, ‘less-loader’],
},
],
},
plugins: [
new HtmlWebpackPlugin({
filename: ‘index.html’,
template: process.env.MODE === ‘multiple’ ? ‘./multiple.html’ : ‘./index.html’,
minify: {
removeComments: true,
collapseWhitespace: true,
},
}),
],
};
入口文件 index.js 就比较重要了,需要完成主应用的很多事情:
import { registerMicroApps, runAfterFirstMounted, setDefaultMountApp, start, initGlobalState } from ‘qiankun’;
import ‘./index.less’;
/**
* 主应用 可以使用任意技术栈
* 以下分别是 React 和 Vue 的示例,可切换尝试
*/
import render from ‘./Render’;
// import render from ‘./render/VueRender’;
/**
* Step1 初始化应用(可选)
*/
render({ loading: true });
const loader = loading => render({ loading });
/**
* Step2 注册子应用
*/
registerMicroApps(
[
{
name: ‘taobao’,
entry: ‘//localhost:7101’,
container: ‘#subapp-viewport’,
loader,
activeRule: ‘/taobao’,
},
{
name: ‘baidu’,
entry: ‘//localhost:7102’,
container: ‘#subapp-viewport’,
loader,
activeRule: ‘/baidu’,
},
],
{
beforeLoad: [
app => {
console.log(‘[LifeCycle] before load %c%s’, ‘color: green;’, app.name);
},
],
beforeMount: [
app => {
console.log(‘[LifeCycle] before mount %c%s’, ‘color: green;’, app.name);
},
],
afterUnmount: [
app => {
console.log(‘[LifeCycle] after unmount %c%s’, ‘color: green;’, app.name);
},
],
},
);
const { onGlobalStateChange, setGlobalState } = initGlobalState({
user: ‘qiankun’,
});
onGlobalStateChange((value, prev) => console.log(‘[onGlobalStateChange - master]:’, value, prev), true);
setGlobalState({
ignore: ‘master’,
user: {
name: ‘master’,
},
});
/**
* Step3 设置默认进入的子应用
*/
setDefaultMountApp(‘/taobao’);
/**
* Step4 启动应用
*/
start();
runAfterFirstMounted(() => {
console.log(‘[MainApp] first app mounted’);
});
上面主要完成:初始化、注册子应用、设置配置全局状态、设置默认进入子应用、启动应用。
至于初始渲染函数,可以这么写:
import React from ‘react’;
import ReactDOM from ‘react-dom’;
/**
* 渲染子应用
*/
function Render(props) {
const { loading } = props;
return (
<>
{loading &&
Loading…
}</>
);
}
export default function render({ loading }) {
const container = document.getElementById(‘subapp-container’);
ReactDOM.render(, container);
}
实现子应用
子应用其实和官网的差不多,这里以 React.js 子应用举例。首先用 create-react-app
来创建子应用:
create-react-app baidu
在 src
目录下新增 public-path.js
:
if (window.POWERED_BY_QIANKUN) {
webpack_public_path = window.INJECTED_PUBLIC_PATH_BY_QIANKUN;
}
设置 history 模式路由的 base:
const RouteExample = () => {
return (
<Router basename={window.POWERED_BY_QIANKUN ? ‘/baidu’ : ‘/’}>
Home About);
};
export default function App() {
return (
淘宝Taobao
);
}
__POWERED_BY_QIANKUN__
用于判断现在是否作为子应用被访问,其它地方与普通 React.js App 没差别。
去掉一些无用的文件后,在入口配置子应用:
function render(props) {
const { container } = props;
ReactDOM.render(, container ? container.querySelector(‘#root’) : document.querySelector(‘#root’));
}
if (!window.POWERED_BY_QIANKUN) {
render({});
}
// 监听全局状态
function storeTest(props) {
props.onGlobalStateChange((value, prev) => console.log(‘淘宝’, [onGlobalStateChange - ${props.name}]:
, value, prev), true);
props.setGlobalState({
ignore: props.name,
user: {
name: props.name,
},
});
}
export async function bootstrap() {
console.log(‘[淘宝] react app bootstraped’);
}
export async function mount(props) {
console.log(‘[淘宝] props from main framework’, props);
storeTest(props);
render(props);
}
export async function unmount(props) {
const { container } = props;
ReactDOM.unmountComponentAtNode(container ? container.querySelector(‘#root’) : document.querySelector(‘#root’));
}
注意上面的 bootstrap
, mount
和 unmount
一定要 export 出去,不然没人知道这个是子应用。
下一步,是修改 Webpack 的配置。但是 creat-react-app 造出来的 React App 不 eject 出来就改不了,这里官网推荐使用 @rescripts/cli
来修改:
yarn add -D @rescript/cli
在根目录添加 .rescriptsrc.js
,并加上:
const { name } = require(‘./package’);
module.exports = {
webpack: config => {
config.output.library = ${name}-[name]
;
config.output.libraryTarget = ‘umd’;
config.output.jsonpFunction = webpackJsonp_${name}
;
config.output.globalObject = ‘window’;
return config;
},
devServer: _ => {
const config = _;
config.headers = {
‘Access-Control-Allow-Origin’: ‘*’,
};
config.historyApiFallback = true;
config.hot = false;
config.watchContentBase = false;
config.liveReload = false;
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
;
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-x2lLELg2-1715280293664)]
[外链图片转存中…(img-hzCeUPkP-1715280293664)]
[外链图片转存中…(img-tZWFuSgn-1715280293665)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!