zoukankan      html  css  js  c++  java
  • 在vue中使用import()来代替require.ensure()实现代码打包分离

    一、require.ensure() 方法来实现代码打包分离

    require.ensure() 是 webpack 特有的,已经被 import() 取代。

    require.ensure(
      dependencies: String[],
      callback: function(require),
      errorCallback: function(error),
      chunkName: String
    )

    给定 dependencies 参数,将其对应的文件拆分到一个单独的 bundle 中,此 bundle 会被异步加载。
    当使用 CommonJS 模块语法时,这是动态加载依赖的唯一方法。
    意味着,可以在模块执行时才运行代码,只有在满足某些条件时才加载依赖项。
    这个特性依赖于内置的 Promise。如果想在低版本浏览器使用 require.ensure,
    记得使用像 es6-promise 或者 promise-polyfill 这样 polyfill 库, 来预先填充(shim) Promise 环境。

    var a = require('normal-dep');
    if ( module.hot ) {
      require.ensure(['b'], function(require) {
        var c = require('c');
        // Do something special...
      });
    }

    按照上面指定的顺序,webpack 支持以下参数:

    dependencies:字符串构成的数组,声明 callback 回调函数中所需的所有模块。
    callback:只要加载好全部依赖,webpack 就会执行此函数。require 函数的实现,作为参数传入此函数。当程序运行需要依赖时,可以使用 require() 来加载依赖。函数体可以使用此参数,来进一步执行 require() 模块。
    errorCallback:当 webpack 加载依赖失败时,会执行此函数。
    chunkName:由 require.ensure() 创建出的 chunk 的名字。通过将同一个 chunkName 传递给不同的 require.ensure() 调用,我们可以将它们的代码合并到一个单独的 chunk 中,从而只产生一个浏览器必须加载的 bundle。
    虽然我们将 require 的实现,作为参数传递给回调函数,然而如果使用随意的名字,
    例如 require.ensure([], function(request) { request('someModule'); })
    则无法被 webpack 静态解析器处理,所以还是请使用 require,例如 require.ensure([], function(require) { require('someModule'); })。

    二、在vue中使用import()来代替require.ensure()实现代码打包分离

    有时候我们想把某个路由下的所有组件都打包在同个异步块 (chunk) 中。
    只需要使用 命名 chunk,一个特殊的注释语法来提供 chunk name (需要 Webpack > 2.4)。

    const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')
    const Bar = () => import(/* webpackChunkName: "group-foo" */ './Bar.vue')
    const Baz = () => import(/* webpackChunkName: "group-foo" */ './Baz.vue')

    Webpack 会将任何一个异步模块与相同的块名称组合到相同的异步块中。

    例:require.ensure()实现

    const notFound = r => require.ensure([], () => r(require('@views/common/404')), 'index')
    const login = r => require.ensure([], () => r(require('@views/common/login')), 'index')
    const register = r => require.ensure([], () => r(require('@views/common/register')), 'index')
    const main = r => require.ensure([], () => r(require('@views/main')), 'index')
    const myWorks = r => require.ensure([], () => r(require('@views/my/index')), 'my')
    const myAccountSetting = r => require.ensure([], () => r(require('@views/my/account-setting')), 'my')
    const makeIndex = r => require.ensure([], () => r(require('@views/make/index')), 'make')

    例:import()实现

    const notFound = () => import(/* webpackChunkName: "index" */ '@views/common/404')
    const login = () => import(/* webpackChunkName: "index" */ '@views/common/login')
    const register = () => import(/* webpackChunkName: "index" */ '@views/common/register')
    const main = () => import(/* webpackChunkName: "index" */ '@views/main')
    const myWorks = () => import(/* webpackChunkName: "my" */ '@views/my/index')
    const myAccountSetting = () => import(/* webpackChunkName: "my" */ '@views/my/account-setting')
    const makeIndex = () => import(/* webpackChunkName: "make" */ '@views/make/index')
  • 相关阅读:
    “大型票务系统”和“实物电商系统”在恶意订单方面的差别与联系
    Eclipse_java项目中导入外部jar文件
    03007_JDBC概述
    微笑心灵“医”路 -- 09级临床医学雷林鹏访谈实录
    雷林鹏:一个90后草根创业者的野蛮生长
    关于hugepages 3.txt
    人物专访:全面发展的企业家——雷林鹏
    热备模式相关问题2.txt
    农林苗木人物专访:雷林鹏 追求本质
    热备模式相关问题2.txt
  • 原文地址:https://www.cnblogs.com/superfeeling/p/14185812.html
Copyright © 2011-2022 走看看