zoukankan      html  css  js  c++  java
  • webpack代码分割和懒加载

    代码分割:

    分离业务代码 和 第三方依赖

    分离业务代码 和业务公共代码 和第三方依赖

    分离首次加载 和 访问加载后的代码

    常用的:require.ensure()

       []:denpendencies

        callback

         errorCallback

        chunkName 

    首先第一步这次是代码分割和上节有变化,我们把配置变了。然后来看看,这和前面也没啥关系,新的一节

        

    var webpack=require('webpack')
    var path=require('path')
    
    module.exports={
    entry:{
    'pageA':'./src/pageA',
    // 'pageB':'./src/pageB',
    // 'vendor':['lodash']
    
    },
    output:{
    path:path.resolve(__dirname, './dist'),
    filename:'[name].bundle.js',
        chunkFilename: "[name].chunk.js"
    },

     

    代码长成这样,然后打包的话。pagea有的依赖有:

    import './subPageA'
    import './subPageB'
    import * as _ from 'lodash'
    export default 'pageA'

    一次性打包的话依赖非常多的文件,打包下来的文件有点大。他别是那个lodash插件的代码特别多。

    大概会长成这个样子。

    所以会用到上面那个require.ensure(),这是一种按需加载,webpack 在编译时,会静态地解析代码中的 require.ensure(),同时将模块添加到一个分开的 chunk 当中。这个新的 chunk 会被 webpack 通过 jsonp 来按需加载。

    • 依赖 dependencies

      这是一个字符串数组,通过这个参数,在所有的回调函数的代码被执行前,我们可以将所有需要用到的模块进行声明。

    • 回调 callback

      当所有的依赖都加载完成后,webpack会执行这个回调函数。require 对象的一个实现会作为一个参数传递给这个回调函数。因此,我们可以进一步 require() 依赖和其它模块 提供下一步的执行。

    • chunk名称 chunkName

      chunkName 是提供给这个特定的 require.ensure() 的 chunk 的名称。通过提供 require.ensure() 不同执行点相同的名称,我们可以保证所有的依赖都会一起放进相同的 文件束(bundle)。这一部分是放在代码中的,也就是这样

    import './subPageA'
    import './subPageB'
    
    require.ensure(['lodash'],function () {
        var _=require('lodash')
        _.join(['1','2'],'3')
    },'vendor')
    export default 'pageA'
    // dependencies:'lodash'
    //callback: function()
    //chunkName:vendor

    然后开始打包

    这里说下,打包以后就会生成两个js文件。但是pageA中依赖的两个js并不是单纯的js,他们也有共同的依赖,如果给这个共同的依赖

    提出来会不会好一些了。然后开始了。

    var page=subPageA
    if(page==='subPageA'){ require.ensure(['./subPageA'],function () { var subpageA=require('./subPageA') },'subPageA') } else if(page==='subPageB'){ require.ensure(['./subPageB'], function () { var subpageA=require('./subPageB') },'subPageB') } require.ensure(['lodash'],function () { var _=require('lodash') _.join(['1','2'],'3') },'vendor') export default 'pageA'

    那个if逻辑没啥用的。然后看图

    现在被打包成了四个。

    那么对于subpageb和subpagea共同的依赖又怎么搞了,

    在page.js文件的开头给她引入进来是个moduleA.js

    requier.include('./moduleA')
    打包以后A,B都变小了,说明引入进来了。

    大概就是这个样子。打包好以后的js文件效果如何了?

    首先会报错,这是怎么回事了。原来要在webpack.config.js里面修改下数据。publicpath:

     

    大概配置成这样就成了。打包好以后生成了三个js文件。

     

    确实给我们打包好了。插件的代码,subpageA的代码,还有主代码pageA.bundle.js。

    然后在subpageA中随便console.log()点代码也是能打印的。说明真的打包好了。

    但是问题来了,我们还有import没有讲到,还有如何实现异步也没说。

    代码修改成这个样子,然后打包,

    然后结构变成这样,没有 chunkName所以变成这样。打开浏览器

     

    然后发现import后的函数马上就执行了。以前subpageA里面的东西也还在,现在打包好的目录结构如下图

    如果想添加 chunkName,在import中添加就行了

  • 相关阅读:
    jquery 绑定事件前先解除事件绑定
    jquer ajax的方法返回值
    jQuery动态生成不规则表格前后端
    常见的正则表达式
    锚点连接
    javascript动态添加删除表格
    java面试题之第二回
    [转]java抽象类和接口
    Java IO 和 NIO
    Java IO之序列化
  • 原文地址:https://www.cnblogs.com/manu-yyj/p/9297429.html
Copyright © 2011-2022 走看看