5-异步组件加载

217 阅读1分钟

在大型应用中我们可能需要将其分成很多小的模块,且只有当我们需要其中的某些模块时,才从服务器中将需要的模块加载。vue允许我们以一个工厂函数的方式来定义组件,这个工厂函数可以异步解析我们的组件定义,只有在组件需要被渲染的时候才触发工厂函数

模拟从服务器加载一个模块:

在App组件的components不直接挂载Test组件,而是通过一个工厂函数Test: () => import('./Test.js'),通过模块化的方式加载组件。只有当我们点击异步加载时,才能够看到下图的Test.js文件。

代码中还有一句注释的导入方式import Test from './Test.js';,两种导入方式有什么区别?

使用import Test from './Test.js';这种导入方式并不能够实现当我们需要时才加载,它会直接加载,我们一打开浏览器就能够直接看到Test.js文件。因为异步加载需要一个工厂函数,所以需要通过Test: () => import('./Test.js')这种方式导入才能够实现。

Test.js:

export default{
    data() {
        return {
            msg: 'Tom'
        }
    },
    template: `
    <h3>{{ msg }}</h3>
    `
}

index.html:

<body>
    <div id="app">
        <App></App>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- 注意:使用es6模块时需给script加上type="module" -->
    <script type="module">
        //import Test from './Test.js';

        const App = {
            data() {
                return {
                    isShow: false
                }
            },
            methods: {
                asyncLoad() {
                    this.isShow = !this.isShow;
                }
            },
            components: {
                //通过模块化的方式加载组件
                Test: () => import('./Test.js')
            },
            template: `
            <div>
                <button @click='asyncLoad'>异步加载</button>
                <Test v-if='isShow'></Test>    
            </div>
            `
        }

        new Vue({
            el: '#app',
            components: {
                App
            }
        })
    </script>
</body>