10分钟弄懂微应用框架——乾坤,真香!

然后,使用 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, mountunmount 一定要 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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-x2lLELg2-1715280293664)]

[外链图片转存中…(img-hzCeUPkP-1715280293664)]

[外链图片转存中…(img-tZWFuSgn-1715280293665)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值