vue-router应用于组件内时的矛盾怎么解决?

JavaScript041

vue-router应用于组件内时的矛盾怎么解决?,第1张

先是入口点 main.js

import App from './components/App.vue'

router.start(App, '#app')

然后在App.vue 也就是根组件里面声明router-view

<router-view      class="view"      keep-alive      transition      transition-mode="out-in">   </router-view>

年前开始负责新项目开发,是一个h5内嵌到企业微信。技术栈是 vite2.x + vue3.x 。随着业务的开展,版本迭代,页面越来越多,第三方依赖也越来越多,打出来的包也越来越大。针对这个问题,很容易就会想到分包这个解决方案。根据 vite 官方文档 提示,做了 vendor 分包之外,还对路由引用的组件做了异步加载处理,也会产生独立分包。这种配置在某个阶段是没问题的。 经过阅读源码,以及官方文档,分析了vite和rollup的分包策略,最后得出这个解决方案: 下面来看看当时是如何分析,以及一步一步来揭开默认分包策略的神秘面纱。 经过测试,在 vite 配置文件,通过 build.rollupOptions.output.manualChunks 配合手动分包策略之后,不会自动生成vendor包。想要知道更清晰 vite 在什么情况会分 vendor 包,什么时候不会分 vendor 包,需要打开源码看清楚。 小结:用户配置了手动分包,就会忽略 vite 提供的 vendor 分包逻辑。 那如果希望在手动分包的基础上还需要 vendor 分包,那么就需要把 vendor 分包的逻辑抄过去就可以了。 备注: 为什么会产生 chunk碎片 ?参考对 webpack 分包的理解,除了入口点(静态入口点、动态入口点)单独生成一个chunk之外,当一个模块被两个或以上的 chunk 引用,这个模块需要单独生成一个 chunk 。 下面从源码的角度看看 rollup 是如何生成这些 chunk碎片 的。 下面来看看 getChunkAssignments 做了什么。 小结: 下面看看通过 createChunks 是如何进行默认分包的 对于生成 chunk签名 ,举个具体点的例子, allEntryPoints 包括一个静态入口点 index.html ,两个动态入口点: Hello.vue 和 World.vue 。有一个模块 sdkUtils.js 的入口点为 Hello.vue (即被 Hello.vue 导入);有一个模块 api.js 的入口点为 Hello.vue 以及 World.vue ;有一个模块 log.js 依赖了 Hello.vue 、 World.vue 和 index.html 。 所以,这个例子中,会产生6个chunk,且 api.js 对应的 chunk 和 log.js 对应的 chunk 就是额外多出来的chunk。 小结:

Document

Document接口表示在浏览器中加载的任何网页,并作为到网页内容的入口点,这是 DOM 树。 DOM树包括诸如<body>和 <table>之类的元素,其他等等。其也为文档(document)提供了全局性的函数,例如获取页面的URL、在文档中创建新的 element 的函数。它为文档提供全局的函数,像如何获取页面的URL和在文档中创建新的元素。

这里主要用于Document的两个方法

1、 document.getElementById

返回一个匹配特定 ID的元素        

<script>

  function changeColor(newColor) {

    var elem = document.getElementById("para1")

    elem.style.color = newColor

  }

  </script>

</head>

<body>

  <p id="para1">Some text here</p>

</body>

新手注意:

新手要注意方法名中 'Id' 的拼写——'getElementByID' 是没有作用的。许多人会忽视这个错误。

如果没有查找到对应的元素,方法会返回null。注意ID参数是大小写敏感的,所以document.getElementById("Main")无法获取到元素<div id="main">,因为'M'和'm'是不一样的。

2、Document.getElementsByClassName()

返回一个类似数组的对象,包含了所有指定 class 名称的子元素。

document.getElementsByClassName('test') //获取所有class为'test'的元素

document.getElementsByClassName('red test') //获取所有class同时包括'red'和'test'的元素