Kbone实战经验分享如何在多端开发中避免踩坑提升效率

ლ艳清 移动 阅读 1,916
赞 46 收藏
二维码
手机扫码查看
反馈

我的写法,亲测靠谱

先说说我在用Kbone时的一些实战经验吧。Kbone是个好东西,能让你的H5页面和小程序无缝切换,但要搞得好也不是那么容易。我一般这样处理:

Kbone实战经验分享如何在多端开发中避免踩坑提升效率

初始化配置

首先,得搞个初始化配置文件,比如webpack.config.js。这个文件里,你需要配置一些关键的东西,比如入口文件、输出路径、模块规则等。

const path = require('path');
const { webpack } = require('@tencent/kbone');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
  },
  module: {
    rules: [
      {
        test: /.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
        },
      },
      {
        test: /.css$/,
        use: ['style-loader', 'css-loader'],
      },
    ],
  },
  plugins: [
    new webpack.KbonePlugin({
      type: 'wechat',
      publicPath: '',
      entry: './src/app.js',
      output: 'dist/app.js',
      globalObject: 'global',
    }),
  ],
};

这里的关键是KbonePlugin,它能帮你生成小程序的代码。配置里的type可以是wechat(微信小程序)、alipay(支付宝小程序)等。publicPath是你的静态资源路径,entry是小程序的入口文件,output是生成的小程序代码路径。

处理CSS样式

在Kbone中处理CSS样式也是个坑点。我一开始直接用css-loader,结果发现样式在小程序里完全失效。后来我发现,需要加个postcss-px-to-viewport插件来处理单位转换。

const postcss = require('postcss');
const pxToViewport = require('postcss-px-to-viewport');

module.exports = {
  module: {
    rules: [
      {
        test: /.css$/,
        use: [
          'style-loader',
          'css-loader',
          {
            loader: 'postcss-loader',
            options: {
              plugins: () => [pxToViewport({ viewportWidth: 750 })],
            },
          },
        ],
      },
    ],
  },
};

这样配置后,你的CSS中的px单位会被自动转成rpx,这样在小程序里就能正常显示了。

处理图片资源

图片资源也是个大坑。一开始我直接用<img src="path/to/image.jpg" />,结果发现在小程序里图片不显示。后来我改用了file-loader

{
  test: /.(png|jpg|gif)$/,
  use: [
    {
      loader: 'file-loader',
      options: {
        name: '[name].[ext]',
        outputPath: 'images/',
      },
    },
  ],
}

这样配置后,图片会被打包到dist/images目录下,并且会生成正确的路径。记得在模板里使用require来引入图片,比如<img src={require('./images/logo.png')} />

处理异步请求

异步请求这块,我建议用axios。但是要注意,小程序里不能直接用fetchXMLHttpRequest,需要通过Kbone提供的miniapp-adapter来适配。

import axios from 'axios';

axios.defaults.adapter = function (config) {
  return new Promise((resolve, reject) => {
    const success = res => {
      resolve(res);
    };
    const fail = err => {
      reject(err);
    };
    wx.request({
      url: config.url,
      method: config.method,
      data: config.data,
      header: config.headers,
      success,
      fail,
    });
  });
};

// 使用示例
axios.get('https://jztheme.com/api/data')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });

这样配置后,你就可以在H5和小程序里无缝使用axios了。

这几种错误写法,别再踩坑了

讲完了我的最佳实践,再说说那些常见的错误写法,希望你们不要再踩这些坑了。

直接用fetchXMLHttpRequest

直接在小程序里用fetchXMLHttpRequest是不行的。因为小程序有自己的一套网络请求API,你需要通过Kbone的适配器来处理。比如下面这种写法就是错的:

fetch('https://jztheme.com/api/data')
  .then(response => response.json())
  .then(data => {
    console.log(data);
  })
  .catch(error => {
    console.error(error);
  });

这种写法在H5里没问题,但在到了小程序里就会报错。一定要用Kbone的适配器。

直接用<img>标签

直接用<img>标签引入图片在小程序里也是不行的。因为小程序的图片路径和H5不一样,需要通过file-loader来处理。比如下面这种写法就是错的:

<img src="./images/logo.png" alt="Logo" />

这种写法在H5里没问题,但在到了小程序里图片就显示不出来。要用file-loader处理后的路径,比如<img src={require('./images/logo.png')} alt="Logo" />

不处理CSS单位转换

如果你不处理CSS单位转换,小程序里样式可能会有问题。比如下面这种写法就是错的:

.container {
  width: 100px;
  height: 100px;
  background-color: #f00;
}

这种写法在H5里没问题,但在到了小程序里px单位可能就不对了。一定要用postcss-px-to-viewport插件来处理单位转换。

实际项目中的坑

最后说说我在实际项目中遇到的一些坑吧。

小程序的性能问题

小程序的性能比H5差,特别是在处理大量数据时。我之前有个项目,数据量一大,小程序就卡得不行。后来我做了几个优化:

  • 尽量减少DOM操作,用虚拟DOM来优化渲染。
  • 使用懒加载,分批加载数据。
  • 优化图片大小,压缩图片。

这几个方法下来,小程序的性能有了明显提升。

跨平台的兼容性问题

虽然Kbone能做到跨平台,但不同平台还是有些差异。比如微信小程序和支付宝小程序的API就有区别。我一般这样处理:

const isWechat = typeof wx !== 'undefined';
const isAlipay = typeof my !== 'undefined';

if (isWechat) {
  // 微信小程序的API
  wx.request({
    url: 'https://jztheme.com/api/data',
    method: 'GET',
    success: res => {
      console.log(res.data);
    },
    fail: err => {
      console.error(err);
    },
  });
} else if (isAlipay) {
  // 支付宝小程序的API
  my.request({
    url: 'https://jztheme.com/api/data',
    method: 'GET',
    success: res => {
      console.log(res.data);
    },
    fail: err => {
      console.error(err);
    },
  });
}

这样根据不同平台调用不同的API,可以解决大部分兼容性问题。

总结

以上是我个人在使用Kbone过程中总结的一些实战经验,希望能对你有所帮助。如果有更好的方案或者你在实际项目中也遇到了什么坑,欢迎在评论区交流。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论