构建配置

mpx利用webpack进行构建打包。通过webpack插件进行能力扩展

自动配置

如果你并不熟悉webpack,可以通过脚手架进行快速配置

手动配置

  1. var MpxWebpackPlugin = require('@mpxjs/webpack-plugin')
  2. var webpackConfig = {
  3. module: {
  4. rules: [
  5. // mpx文件必须设置正确的loader,参考下文详细的loader设置options
  6. {
  7. test: /\.mpx$/,
  8. use: MpxWebpackPlugin.loader({
  9. // `only`模式下,样式前加上注释/* use rpx */可将该段样式中所有的px转换为rpx
  10. transRpx: 'only',
  11. comment: 'use rpx'
  12. })
  13. },
  14. // 对本地图片资源提供增强,编译成小程序支持的格式
  15. // <style>中的图片会被强制转为base64,
  16. // 其他地方引用的资源小于limit的会被转base64,否则会被打包到dist/img目录下通过小程序路径引用
  17. // 由于微信小程序中<cover-image>不支持传base64,可以在图像资源链接后加上`?fallback`查询字符串强制跳过转base64步骤
  18. // 参考下文详细的设置@mpxjs/url-loader的方法
  19. {
  20. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
  21. loader: '@mpxjs/url-loader',
  22. options: {
  23. limit: 10000,
  24. name: 'img/[name].[ext]'
  25. }
  26. }
  27. ]
  28. },
  29. // mpx主插件,必须设置,参考下文详细的插件设置options
  30. plugins: [
  31. new MpxWebpackPlugin({
  32. // 微信模式下设置为`wx`,支付宝模式下设置为`ali`
  33. mode: 'wx'
  34. })
  35. ],
  36. // sourceMap: 小程序不支持eval,因此不要设置为eval相关的sourceMap类型。
  37. // 注意:webpack4新增的mode属性设置为development的时候,会将devtool默认设置为eval,
  38. // 必须手动设置devtool为非eval相关类型来覆盖默认配置
  39. devtool: false,
  40. output: {
  41. // filename设置不能更改
  42. filename: '[name].js'
  43. },
  44. // 通过webpack分包能力减少小程序体积,参考下文的详细介绍
  45. optimization: {
  46. runtimeChunk: {
  47. name: 'bundle'
  48. },
  49. splitChunks: {
  50. chunks: 'all',
  51. name: 'bundle',
  52. minChunks: 2
  53. }
  54. }
  55. }

MpxWebpackPlugin.loader

mpx-webpack-plugin暴露了一个静态方法MpxWebpackPlugin.loader作为.mpx文件的loader

  1. var MpxWebpackPlugin = require('@mpxjs/webpack-plugin')
  2. webpackconfig = {
  3. module: {
  4. rules: [
  5. {
  6. test: /\.mpx$/,
  7. use: MpxWebpackPlugin.loader(options)
  8. }
  9. ]
  10. }
  11. }

options

  • transRpx

    • 类型: Boolean

      是否开启转换rpx

  • comment

    • 类型: String

@mpxjs/url-loader

@mpxjs/url-loader基于小程序对图片资源的支持,在编译阶段提供了增强。

在mpx工程源码中通过路径引用的图片资源,会被进行合适的处理,打包成符合小程序标准的格式。

受限于小程序无法在style中引用相对路径资源,所以样式中的图片会做强制base64。其他的资源则根据limit进行打包配置

  1. // 安装
  2. npm install @mpxjs/url-loader
  1. // 配置
  2. webpackconfig = {
  3. module: {
  4. rules: [
  5. {
  6. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
  7. loader: '@mpxjs/url-loader',
  8. options: /* options */
  9. }
  10. ]
  11. }
  12. }

options

仅对非<style>中的资源生效,因为<style>里的资源会强制做base64

  • limit

    • 类型: Number

      单位为byte,小于limit的资源会被base64,反之会被打包成资源

  • name

    • 类型: String

      设置图片被打包后的路径

MpxWebpackPlugin

  1. var MpxWebpackPlugin = require('@mpxjs/webpack-plugin')
  2. webpackconfig = {
  3. plugins: [
  4. new MpxWebpackPlugin(options)
  5. ],
  6. }

options

  • mode

    • 类型: String

      wx代表编译微信小程序
      ali代表编译支付宝程序

output.filename

小程序限定描述页面的文件具有相同的路径和文件名,仅以后缀名进行区分。

因此output.filename中必须写为 [name].js,基于chunk id或者hash name的filename都会导致编译后的文件无法被小程序识别

  1. webpackconfig = {
  2. output: {
  3. filename: '[name].js', // 正确
  4. filename: '[id].js', // 错误。chunk id name
  5. filename: '[name].[chunkhash].js' // 错误。hash name
  6. }
  7. }

optimization

为了减少打包后app/page/component目录中的js文件体积。mpx提供了抽取公共依赖的能力。将共用的依赖进行统一抽取

通过optimization.runtimeChunkoptimization.splitChunks进行设置

  1. webpackConfig = {
  2. optimization: {
  3. runtimeChunk: {
  4. name: 'bundle'
  5. },
  6. splitChunks: {
  7. chunks: 'all',
  8. name: 'bundle',
  9. minChunks: 2
  10. }
  11. }
  12. }