7.vue和react一起学 (*^_^*)

11 篇文章 0 订阅

代码分割&异步组件

前面都是使用直接通过script引入的方式使用react或者vue框架,然而这种方式,我们得要考虑全局污染、兼容性、代码优化、依赖关系等众多问题。为了让我们的精力更多地放在框架学习上面,从这里开始我们使用构建工具管理我们的程序,当然不是自己去搭建配置。我们使用的是create-react-app或者vue-cli去使用通用的构建配置。

react

创建通用构建配置的react-app

npx create-react-app my-app
  1. 依赖webpack的code-spliting。
    // src\App.js
import React from 'react';
// code-split/tree-shaking , Two未使用则不会打包到输出文件
import { One, Two } from "./code-split"; 
function App() {
  return (
    <div className="App">
      <One/>
    </div>
  );
}

export default App;

  1. 异步组件, 错误边界捕获处理
    // src\App.js
/*
*React.lazy 和 Suspense 技术还不支持服务端渲染。
* 服务端渲染要借助@loadable/component这个库,可以参考:https://www.jianshu.com/p/22bd4eaf70b5
*/ 
import React, { Suspense } from 'react';

// code-spliting/tree-shaking , Two未使用则不会打包到输出文件
import { One } from "./code-split"; 

// 错误边界, 用以捕获子组件件内发生的错误。无法捕获自身错误、异步代码、服务端渲染以及事件执行函数错误。你可以尝试在子组件抛出错误看看效果。
import ErrorCatch from "./code-split/error-catch";

// 动态导入, 仅支持default exports
const  Two = React.lazy(() => import('./code-split/default'));

class Container extends React.Component {
  render() {
    return (<Suspense fallback={<div>Loading...</div>}>
        <Two/>
    </Suspense>)
  }
}

function App() {
  return (
    <div className="App">
      <ErrorCatch>
        <One/>
        <Container/>
      </ErrorCatch>
    </div>
  );
}

export default App;

vue

vue在处理异步组件的原理和react相似。应该都有类似地通过Promise.resovle(“组件逻辑”).then(module=> module.default).then(component => component );
全局安装:

npm install -g @vue/cli

创建通用构建配置的vue-app

vue create my-app
  1. 依赖webpack的code-spliting。
    都是通过依赖构建工具code-spliting。

  2. 异步组件, 错误捕获处理
    // src\App.vue

<template>
  <div id="app">
    <async-component-one/>
    <async-component-two/>
    <async-component-three/>
  </div>
</template>
<script>
import Vue from "vue";

// 异步组件工厂函数=>返回import Promise函数
const AsyncComponentOne = ()=> import('./components/AsyncComponent.vue');
const AsyncComponentThree = (resolve)=>{
  // 返回 包含render函数或者template的对象
  setTimeout(() => {
    resolve({render(h){return(h("div", "i am asyncComponent"))}})
  },2000)
  // or
  //require(['./my-async-component'], resolve) ,可以用到code-splitting
};

// 异步组件工厂函数=>返回异步导入配置对象
const AsyncComponentTwo = ()=> ({
  // 需要加载的组件 (应该是一个 `Promise` 对象)
  component: new Promise((resolve)=>{
    setTimeout(()=>{
      resolve(import('./components/AsyncComponent.vue'))
    }, 1000)
  }),
  // 异步组件加载时使用的组件
  loading: Vue.component("loading",{render(h){return(h("div", "loading..."))}}),
  // 加载失败时使用的组件
  error: Vue.component("error",{render(h){return(h("div", "error!!!"))}}),
  // 展示加载时组件的延时时间。默认值是 200 (毫秒)
  delay: 200,
  // 如果提供了超时时间且组件加载也超时了,
  // 则使用加载失败时使用的组件。默认值是:`Infinity`
  timeout: 3000
});
export default {
  name: 'App',
  components: {
    AsyncComponentOne,
    AsyncComponentTwo,
    AsyncComponentThree
  }
}
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值