首页 > 建站教程 > 前端框架 >  webpack5学习笔记:代码懒加载、optimization.runtimeChunk正文

webpack5学习笔记:代码懒加载、optimization.runtimeChunk

# 代码懒加载

1. 动态import使用最多的一个场景是懒加载(比如路由懒加载)

    封装一个 component.js,返回个 component对象

    我们可以点击按钮时,加载这个对象


## 示例

1. 新建 element.js

```

const element = document.createElement('div')

element.innerHTML = 'Hello Element'

export default element

```

2. 入口文件

```

const button = document.createElement('button')

button.innerText = '加载'

button.addEventListener('click', () => {

    import(/* webpackChunkName: 'element' */ './element.js').then(res => {

        document.body.appendChild(res.default)

    })

})

document.body.appendChild(button)

```

    此时,运行,打开控制台,点击 ‘加载’按钮,就可以看到,‘element.bundle.js’ 被加载。


## 上面懒加载的缺点:

1. 点击才开始加载js文件

2. 加载完再解析


## webpack 预加载(空闲时,加载)———— prefetch  -> 魔法注释(magic comments)

1. 改造上面的入口文件代码

```

const button = document.createElement('button')

button.innerText = '加载'

button.addEventListener('click', () => {

    import(

        /* webpackChunkName: 'element' */

        /* webpackPrefetch: true */

        './element.js'

    ).then(res => {

        document.body.appendChild(res.default)

    })

})

document.body.appendChild(button)

```


## webpack 预获取 ———— preLoad  -> 魔法注释(magic comments),没有 prefetch用的多

1. preLoad 跟随父模块一起下载的

```

const button = document.createElement('button')

button.innerText = '加载'

button.addEventListener('click', () => {

    import(

        /* webpackChunkName: 'element' */

        /* webpackLoad: true */

        './element.js'

    ).then(res => {

        document.body.appendChild(res.default)

    })

})

document.body.appendChild(button)

```



# optimization.runtimeChunk 配置

1. 它主要决定要不要将运行时的代码单独抽离到一个chunk文件里

2. 默认,通过import等导入的模块等代码,都是打包到主模块(入口文件)里如 main.bundle.js中的,这里就是决定这些模块是否单独抽离出来


## webpack.config.js 中配置

```

optimization: {

    // true/multiple 抽离到多个文件

    // single 抽离到一个文件

    // 不配置,不抽离

    // object.name 设置抽离的名字

    // runtimeChunk: {

    //    name: 'runtime-5imoban'  // 这个名字最终会拼接到:output.filename 中

    // }

    runtimeChunk: {

        name: function(entrypoint) {

            return `5imoban-${entrypoint.name}`   // 最终打包的名字为: 5imoban-入口文件名.bundle.js

        }

    }

},

```