• 图像资源处理
    • 引用线上资源
    • 引用本地资源
    • 动态引用本地资源

    图像资源处理

    小程序对于图片资源存在一些限制,使得习惯开发web应用的开发者面对小程序时无法理解差异性

    mpx提供了@mpxjs/url-loader对小程序中各种资源加载方式进行处理。

    本文会从使用的角度出发,介绍小程序既有的对图像资源的限制,以及@mpxjs/url-loader是如何解决这些问题。


    引用线上资源

    小程序原生支持在wxsswxml中使用线上资源,这点和开发web应用没有太多区别。

    无需任何配置,就可以直接在.mpx中引用线上资源。

    webpack.config.js

    1. webpackconfig = {
    2. // 不需要配置
    3. }

    index.mpx

    1. <template>
    2. <view>
    3. <image src='http://my.cdn.com/bg2.png'/>
    4. <view class="container"></view>
    5. <view>
    6. </template>
    7. <style lang="css">
    8. .container: {
    9. background-image: url('http://my.cdn.com/bg1.png');
    10. }
    11. </style>

    引用本地资源

    • <style>中使用本地资源

      小程序不支持在.wxss的样式中使用本地资源,因此@mpxjs/url-loader会对<style>中的图片做强制base64

      webpack.config.js

      1. webpackconfig = {
      2. module: {
      3. rules: [
      4. {
      5. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
      6. loader: '@mpxjs/url-loader',
      7. options: /* 强制转换,所以options不做限制 */
      8. }
      9. ]
      10. }
      11. }

      index.mpx

      1. <style lang="css">
      2. .container: {
      3. background-image: url('./bg-img.png');
      4. }
      5. </style>

      编译后变成base64

    • <image>组件src属性使用本地资源

      小程序既可以用路径方式引用本地图片资源,也可以用base64进行内联

      设置@mpxjs/url-loaderlimit,资源体积超过limit的做打包处理

      webpack.config.js

      1. webpackconfig = {
      2. module: {
      3. rules: [
      4. {
      5. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
      6. loader: '@mpxjs/url-loader',
      7. options: {
      8. limit: 10000,
      9. name: 'img/[name].[ext]'
      10. }
      11. }
      12. ]
      13. }
      14. }

      index.mpx

      1. <template>
      2. <view>
      3. <image src='./bg2.png'/>
      4. <view>
      5. </template>
    • <cover-image>组件src属性使用本地资源

      <cover-image>只能引入线上资源或者通过路径引入本地资源,无法base64。

      可以在资源地址后面加上查询字符串?fallback禁止base64

      webpack.config.js

      1. webpackconfig = {
      2. module: {
      3. rules: [
      4. {
      5. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
      6. loader: '@mpxjs/url-loader',
      7. options: {
      8. limit: 10000,
      9. name: 'img/[name].[ext]'
      10. }
      11. }
      12. ]
      13. }
      14. }

      index.mpx

      1. <template>
      2. <view>
      3. <cover-image src='./bg2.png?fallback'/>
      4. <view>
      5. </template>

    动态引用本地资源

    利用@mpxjs/url-loader,配合mpx提供的计算属性,实现在运行阶段动态设置图片

    文件目录

    1. component
    2. │-- index.mpx
    3. │-- dark.png
    4. │-- light.png

    webpack.config.js

    1. webpackconfig = {
    2. module: {
    3. rules: [
    4. {
    5. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
    6. loader: '@mpxjs/url-loader',
    7. otions: {
    8. limit: 10000,
    9. name: 'img/[name].[ext]'
    10. }
    11. }
    12. ]
    13. }
    14. }

    index.mpx

    1. <template>
    2. <view>
    3. <image src='{{dynamicSrc}}'/>
    4. <view class="container" style='{{dynamicStyle}}'>i have a background image</view>
    5. <button bindtap="clickHandler">click me to change</button>
    6. </view>
    7. </template>
    8. <script>
    9. import {createPage} from '@mpxjs/core'
    10. // 如果是有限张图片
    11. import dark from './dark.png'
    12. import light from './light.png'
    13. createPage({
    14. data: {
    15. count: 0,
    16. imageId: '1'
    17. },
    18. computed: {
    19. dynamicSrc() {
    20. return (this.count % 2 === 0) ? dark : light
    21. },
    22. dynamicStyle() {
    23. let url = (this.count % 2 !== 0) ? dark : light
    24. return `background-image: url(${url})`
    25. },
    26. background () {
    27. // 如果期望整个bgs文件夹里的图片都被纳入
    28. return require('./bgs/' + this.imageId + '.jpg')
    29. }
    30. },
    31. methods: {
    32. clickHandler() {
    33. this.count++
    34. }
    35. }
    36. })
    37. </script>
    38. <style lang="stylus">
    39. .container
    40. height: 150px
    41. </style>

    通过点击button,两个元素的图片会动态变化