webpack分包实操和总结

本文介绍了如何使用Webpack进行前端项目的模块分包,包括配置多入口打包、提取公共模块以减少体积,以及利用动态导入实现按需加载,从而提升应用的响应速度和运行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

通过webpack实现前端项目整体模块化的优势固然很明显,但是它同样存在一些弊端,那就是我们项目中的所有代码最终都被打包到了一起,如果我们应用非常复杂,模块非常多的话,我们的打包结果就会特别的大。
而事实情况是,大多数时候,我们在应用开始工作时,并不是我们所有的模块都需要加载进来的,但是这些模块又被全部打包到一起,我们需要任何一个模块,都需要把整体加载过后才能使用,而我们的应用有一般是运行在浏览器端,那就意味着我们会浪费掉很多的流量和带宽。
那更合理的方案就是把我们的打包结果按照一定的规则去分离到多个bundle中,然后根据我们应用的运行需要,按需加载这些模块。这样我们就能大大提高应用的响应速度与运行效率。
目前webpack实现分包的方式主要有以下两种:
第一种是根据我们的业务去配置不同的打包入口,也就是我们会有多个打包入口同时打包,输出多个打包结果。
第二种就是采用ESM的动态导入功能,去实现模块的按需加载,这个时候webpack会把我们动态加载的模块单独输出到一个bundle中。

一、多入口打包

现有如下文件结构:
在这里插入图片描述
分为album页面内容、index.html页面内容、global.css公共样式、fetch.js是一个公共的提供请求api的模块,尝试为这个案例创建多个打包入口。

const HtmlWebpackPlugin = require("html-webpack-plugin")

module.exports = {
   mode:"none",
   entry:{ // 将entry配置成一个对象,来设置多个打包入口
       index:"./src/index.js",
       album:"./src/album.js"
   },
   output:{// 修改输出文件名
       filename:"[name].bundle.js" // 通过[name]这种占位符的方式动态输出文件名,[name]最终就会替换成打包入口名称
   },
   module:{
       rules:[
           {
               test:/\.css$/,
               use:[
                   "style-loader",
                   "css-loader"
               ]
           }
       ]
   },
   plugins:[
       new CleanWebpackPlugin(),
       new HtmlWebpackPlugin({
           title:"Multi Entry",
           template:"./src/index.html",
           filename:"index.html"
       }),
       new HtmlWebpackPlugin({
           title:"Multi Entry",
           template:"./src/album.html",
           filename:"album.html"
       })
   ]
}

打包结果:
在这里插入图片描述
但是生成的html中会载入两个打包后的bundle.js,我们只希望其引入自身的bundle.js
在这里插入图片描述
在HtmlWebpackPlugin通过chunks属性指定载入的bundle.js文件

new HtmlWebpackPlugin({
   title:"Multi Entry",
    template:"./src/index.html",
    filename:"index.html",
    chunks:['index']
}),
new HtmlWebpackPlugin({
    title:"Multi Entry",
    template:"./src/album.html",
    filename:"album.html",
    chunks:['album']
})

此时再打包,生成的html就只会载入自身需要的bundle.js了。

二、提取公共模块

在index.js和alubm.js中都有对公共模块的引入

import fetchApi from './fetch'
import './global.css'
import './index.css'

然后执行打包就会生成一个包含这些公共模块的js文件。但是我这没有生成,很头疼。找了很久,结果发现需要加上一个name属性。

optimization: {
    splitChunks: {
        chunks: 'all'
    }
}

这样就能成功将公共模块的js文件提取出来了,生成了一个common.bundle.js。

三、动态导入模块

假设我们有一个单页面应用,根据需求来载入模块。

// posts模块
export default () => {
  const posts = document.createElement('div')
  posts.className = 'posts'

  posts.innerHTML = '<h2>Posts</h2>'

  return posts
}
import posts from './posts/posts'
import album from './album/album'//结构与posts一样

const render = () => {
  const hash = window.location.hash || '#posts'

  const mainElement = document.querySelector('.main')

  mainElement.innerHTML = ''

  if (hash === '#posts') {
    mainElement.appendChild(posts())
  } else if (hash === '#album') {
    mainElement.appendChild(album())
  }
}

render()

window.addEventListener('hashchange', render)


我们在打包入口中同时导入了ablum模块和posts模块,当锚点发生变化时,根据锚点的值去决定要显示哪个组件,这里就会存在浪费的可能性,如果用户打开应用后只是访问了其中一个页面,另外一个页面所对应的模块的加载就是浪费,所以采用动态导入的方式就不会有浪费了。

动态导入就是采用ES Module的动态导入。

const render = () => {
  const hash = window.location.hash || '#posts'

  const mainElement = document.querySelector('.main')

  mainElement.innerHTML = ''

  if (hash === '#posts') {
    import('./posts/posts').then(({ default: posts }) => {
      mainElement.appendChild(posts())
    })
  } else if (hash === '#album') {
    import('./album/album').then(({ default: album }) => {
      mainElement.appendChild(album())
    })
  }
}

render()

执行打包,打包结果:
在这里插入图片描述
如果命名一致,会打包到一个文件中,否则是多个文件。

<think>好的,用户想了解开发微信小程序需要哪些知识。首先,我得考虑用户的背景,可能是一个刚入门的开发者或者对编程不太熟悉的人。需要从基础开始讲,但也不能太简单,否则可能无法满足他们的需求。 首先,微信小程序主要使用前端技术,所以HTML、CSSJavaScript是基础。不过小程序有自己的一套框架,比如WXMLWXSS,用户可能不知道这些,需要解释清楚。同时,微信的文档很重要,应该推荐他们去查阅官方文档。 然后,要考虑用户是否需要全栈开发的知识。比如后端服务,数据库,API设计这些,虽然小程序前端是重点,但项目可能需要后端支持,所以这部分也应该提到。另外,云开发是微信提供的服务,可能简化后端工作,值得介绍。 工具方面,微信开发者工具是必须的,还有版本控制如Git,这些工具的使用对团队协作很重要,用户可能自己学习或者团队合作,所以需要涵盖。 其他方面,比如UI设计、性能优化、发布流程,这些容易被新手忽略,但际开发中很重要,需要提醒用户注意。跨平台兼容性可能也是一个问题,毕竟小程序在不同设备上表现可能不同。 用户可能的深层需求是想知道学习的路径步骤,或者想评估自己现有的知识是否足够。所以应该结构清晰,分点列出,让用户能逐步学习。同时,推荐官方文档社区资源,帮助他们进一步学习。 最后,要确认回答是否全面,有没有遗漏重要知识点,比如小程序的生命周期、API使用、权限管理等等。可能需要检查一下,确保覆盖所有关键领域,让用户有一个全面的了解。</think>微信小程序需要掌握以下核心知识技能,适合不同阶段的学习者逐步掌握: ### 一、基础前端技术 1. **HTML/CSS 变种** - **WXML**:微信自研的模板语言(类似HTML) - **WXSS**:基于CSS的样式语言(新增rpx响应式单位) 2. **JavaScript 增强** - 小程序特有API(如wx.request) - ES6+语法(Promise/async-await) - 模块化开发(require/模块导出) 3. **框架基础** - 数据绑定({{}}语法) - 事件系统(bindtap/catchtap) - 生命周期管理(onLoad, onShow等) ### 二、小程序特有体系 1. **架构核心** - 四层文件结构: ``` ├─pages/ │ └─home/ │ ├─home.js # 逻辑层 │ ├─home.json # 配置 │ ├─home.wxml # 结构 │ └─home.wxss # 样式 ``` 2. **核心组件库** - 视图容器:scroll-view/swiper - 表单组件:picker/checkbox - 媒体组件:video/live-player 3. **能力扩展** - 开放接口(微信登录/支付) - 设备API(蓝牙/陀螺仪) - 云开发(CloudBase) ### 三、开发环境 1. **工具链** - 微信开发者工具(调试/真机预览) - VSCode + 小程序插件(代码提示) - 自动化构建(gulp/webpack) 2. **调试技巧** - 网络请求抓包 - 性能分析工具 - 异常监控(sourcemap解析) ### 四、进阶方向 1. **跨平台方案** - Taro/Uni-app框架使用 - 多端代码适配技巧 2. **性能优化** - 首屏加载优化(分包/预加载) - 内存管理(大列表渲染) - 动画性能优化(CSS3动画) 3. **安全防护** - 敏感数据加密 - HTTPS强制使用 - 接口防刷策略 ### 五、配套能力 1. **服务端开发** - Node.js(Express/Koa) - RESTful API设计 - WebSocket时通信 2. **运维部署** - CI/CD自动化 - 灰度发布策略 - 错误日志收集 ### 学习路线建议: 1. 官方文档通读(至少完成60%) 2. 微信开发者工具练习 3. 仿写官方Demo(建议手敲代码) 4. 参与开源项目贡献 5. 持续关注小程序能力更新 ### 常见误区: - 忽视小程序体积限制(主包需控制在2MB内) - 过度使用第三方库导致性能问题 - 忽略不同微信版本兼容性 - 未适配不同屏幕尺寸(特别是iPad端) 掌握这些内容后,可以应对大多数小程序开发需求。建议从官方「小程序示例」项目开始践,逐步深入复杂功能开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值