评论

如何使用第三方 npm 扩展包

第三方 npm 扩展包的使用

上一篇传参的示例中,不知道你是否注意到,像 isPast(判断日期是否为过去) 或者 number(距离当前的天数) 参数,根本就不需要传输嘛,这些应该是计算出来的。

然而,如果让你来写日期计算的 API,我相信绝大多数开发者,都不一定能够写出来,好在,这块有成熟的库可以使用,例如:moment.js,还有 dayjs,这篇文章就来介绍一下,如何在小程序中使用第三方 npm 扩展?

这块内容,官方文档已经写得比较清楚了,在工具 — 开发辅助 — npm 支持下,目录层次比较深,所以,在最开始的时候,建议通读一遍文档,还是非常有必要的。

npm 支持的要求

小程序并非从一开始就支持 npm,而是在基础库版本 2.2.1 或以上、及开发者工具 1.02.1808300 或以上的时候,才开始支持。

所以,这两个条件一定要注意,当然,如果才开始学习小程序开发,用最新版的就可以了。

安装 dayjs

用命令行进入项目目录,使用下面命令安装 dayjs

npm init
npm i dayjs --production

第一条命令是初始化 npm,第二条命令是安装 dayjs 包。

然后打开开发者工具,在本地设置中,勾选使用 npm 模块,如下图:

最后,打开工具菜单,点击构建 npm 即可。

目录变化

构建完成后,项目目录中会多出几个文件:

  • package.json
  • package-lock.json
  • node_modules
  • miniprogram_npm

前面三个是 npm 初始化时,默认生成的,最后一个目录是开发者工具构建 npm 时生成的,可以理解为小程序版的 npm 包。

使用方法与 node.js 开发一致,下面就来完善上一篇中的例子。

页面改写

打开 days 的 index.wxml 文件,将页面静态内容替换成变量,代码如下:

<view class="list" bindtap='goto' data-title="{{ day.title }}" data-date="{{ day.date }}" data-isPast="{{ day.isPast }}" data-number="{{ day.number }}">
  <view class="title">{{ day.title }}</view>
  <view class="date-number {{ day.isPast?'primary':'danger' }}">{{ day.number }}</view>
  <view class="date-desc">{{ day.isPast?"已过天数":"还剩天数" }}</view>
  <view class="desc">{{ day.date }}</view>
</view>

可以看出,从逻辑层传过来一个 day 的对象。

逻辑层添加 day 对象数据,打开 days 目录的 index.js 文件,编写代码如下:

data: {
  day: {
    date: '2019-10-01',
    title: '新中国成立 70 周年'
  }
},

这里只有 date 和 title 属性值,并没有 isPast 和 number,因为 isPast 和 number 值应该是实时计算出来的,而无需储存。

当前的页面是不完整的,接下来就是 dayjs 上场的时候了。

引入 dayjs 初始化数据

接着编辑 js 代码,引入 dayjs 模块,编写初始化数据函数,如下代码所示:

// 引入 dayjs
const dayjs = require('dayjs');
// 当天日期
const today = dayjs().format('YYYY-MM-DD');
// 初始化数据
const init_data = function(day){
  let date = day.date;
  day.isPast = today > date;
  day.number = dayjs(date).diff(dayjs(today), 'day');
  return day;
}

dayjs 的用法不多介绍了,可自行查看文档,init_data 函数在初始数据上,添加了两个参数 isPast 和 number,使用 dayjs 模块提供的 API 可以快速计算它们的值。

最后,在页面事件函数 onShow 中,调用初始化函数,代码如下:

onShow: function () {
  this.setData({
    day: init_data(this.data.day)
  });
},

这样,整体代码就写完了,只需要一个 titledate,就可以实时计算出相隔的天数,引入 dayjs 模块,让这个计算的过程,简单了许多。

总结

这篇文章介绍了 npm 包的引入,安装以及使用。并实际演示了 dayjs 日期库的使用,进而完善了上一篇中的例子。

这里留一个作业题,看能不能结合前面的内容,完成一个完整的「计算日子」功能。

PS. 目前 demo 中只缺少添加日期,显示日期列表,以及存储日期的功能了,正好这些知识点,前面已经都介绍过了。


写完这篇文章,距离国庆节还剩下 22 天。

更多文章:https://github.com/pengloo53/miniprogram-articles

点赞 5
收藏
评论

5 个评论

  • George (乔治)
    George (乔治)
    2021-01-27

    使用gulp可以自己自动拷贝:

    gulp.task('buildPlugins'() => {
       // 按需拷贝(否则太大了)
       const names = [
        'updateLocale',
        'localizedFormat',
        'utc',
        'timezone',
        'relativeTime'
      ].join(',');
      // 注意('dist'路径。你的文件结构可能不同)
      return gulp.src(`node_modules/dayjs/plugin/{${names}}.js`).pipe(gulp.dest(`dist/miniprogram_npm/dayjs/plugin`))
    });
    
    2021-01-27
    赞同 1
    回复
  • Sunflower
    Sunflower
    05-22

    我手动把 zh-cn.js 从 dayjs 的包中,复制到自己项目下,可以解决

    05-22
    赞同
    回复
  • qe
    qe
    2020-08-06

    微信小程序打包出来的miniprogram_npm里面只包含了基础的dayjs模块,打包成一个index.js入口。可选的插件和国际化包都没有打包进来,这怎么办呢?

    2020-08-06
    赞同
    回复 6
    • 呓
      2020-09-25
      我也碰到了这个问题
      2020-09-25
      回复
    • 小小子
      小小子
      2020-10-09
      请问最后是怎么解决的呢
      2020-10-09
      回复
    • 天
      2020-10-23
      同问,请问解决了吗
      2020-10-23
      回复
    • IronBlood
      IronBlood
      2020-12-28
      在 miniprogram_npm/dayjs 目录下建立 locale 和 plugin 目录,手动将需要使用的文件拷贝过去
      2020-12-28
      回复
    • George (乔治)
      George (乔治)
      2021-01-27
      下面回复了这个问题,发错位置了
      2021-01-27
      回复
    查看更多(1)
  • Lf
    Lf
    2019-09-16

    大佬,npm构建出现 Maximum call stack size exceeded这种错误怎么解决呀?

    2019-09-16
    赞同
    回复 2
    • 2019-09-16
      从字面意思来看,应该是引入的包依赖层级太多了。建议尽量引入简单的包,在小程序这种定制环境下,越简单越好。
      2019-09-16
      回复
    • 慢慢。
      慢慢。
      2022-11-11
      我也遇到了
      2022-11-11
      回复
  • 子冥
    子冥
    2019-09-10

    emmmmmmmmm, ( ఠൠఠ )

    2019-09-10
    赞同
    回复
登录 后发表内容