微信小程序使用npm支持踩坑


Posted in Javascript onNovember 07, 2018

前言

最近写了个CNode 社区的微信小程序版本,把在微信小程序中使用npm包,踩的坑记录一下,希望能给遇到类似问题的小伙伴,提供一些思路和方向。

npm 支持

从小程序基础库版本 2.2.1 或以上、及开发者工具 1.02.1808300 或以上开始,小程序支持使用 npm 安装第三方包。

踩坑之路

由于项目中需要格式化一些日期数据,于是选择了moment,一款JavaScript 日期处理类库

首先使用命令行,安装moment

# 打开小程序根目录
cd src
npm install --production moment

然后按照小程序文档往下操作,直到构建完成

于是我们迫不及待的开始使用moment

import moment from 'moment';

let sFromNowText = moment(new Date() - 360000).fromNow();
console.log(sFromNowText);

// 控制台输出:"6 minutes ago"

moment能够正常工作,但是很快我们发现英文不是我们想要的

于是我们找到moment的国际化配置,并设置全局语言为中文

import moment from 'moment';
moment.locale('zh-cn');

let sFromNowText = moment(new Date() - 360000).fromNow();
console.log(sFromNowText);

// 可是控制台,依然输出:"6 minutes ago"

尝试输出moment.locale执行后的返回值

// ...
let sLang = moment.locale('zh-cn');
console.log(sLang);

// 控制台输出:"en"

发现设置语言环境失败了,经过排查和翻阅小程序文档后,发现通过微信开发者工具构建npm后,并不会将语言环境相关文件拷贝到miniprogram_npm目录下,仅将入口js文件及其依赖的模块进行打包处理,进而导致加载中文语言环境失败。以下是摘自小程序文档的一段话:

构建打包分为两种:小程序 npm 包会直接拷贝构建文件生成目录下的所有文件到 miniprogram_npm 中;其他 npm 包则会从入口 js 文件开始走一遍依赖分析和打包过程(类似 webpack)。

快速查看了一下moment源码,发现moment.locale方法,会从./locale/目录下加载语言环境包,于是尝试手动从node_modules/moment/目录下,将中文语言环境包,拷贝到miniprogram_npm目录下

// moment.js
// ...
function loadLocale(name) {
 // ...
 var aliasedRequire = require;
 aliasedRequire('./locale/' + name);
 // ...
}
// ...

经过调试发现,moment定义语言环境时出错,原来是由于构建npm导致入口文件(moment.js)经过打包后更名为index.js导致:Error: module "miniprogram_npm/moment/moment" is not defined

// zh-cn.js
(function(global, factory) {
 typeof exports === 'object' && typeof module !== 'undefined' && typeof require === 'function'
  ? factory(require('../moment'))
  : typeof define === 'function' && define.amd
   ? define(['../moment'], factory)
   : factory(global.moment);
})(this, function(moment) {
 'use strict';

 var zhCn = moment.defineLocale('zh-cn', {
  // ...
 });

 return zhCn;
});

果然手动将'../moment'统一改为'../index',然后重新执行

import moment from 'moment';
moment.locale('zh-cn');

let sFromNowText = moment(new Date() - 360000).fromNow();
console.log(sFromNowText);

// 现在控制台,输出:"6 分钟前"

大功告成,nice! 但也别忘了回过头来,总结一下导致这几个问题的原因:

  • 构建npm会将npm包的入口文件(eg: moment.js),打包后更名为index.js
  • 构建npm仅将npm包的入口js文件及其依赖的模块进行打包处理,并不会将该npm包下一些可选的文件(eg: moment的语言环境包)拷贝到miniprogram_npm目录下

miniprogram_npm 、构建npm及更多npm支持相关信息,请翻阅小程序文档-npm支持

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE autocomplete internet explorer's autocomplete
Jun 30 Javascript
精解window.setTimeout()&window.setInterval()使用方式与参数传递问题!
Nov 23 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 Javascript
js实现的复制兼容chrome和IE
Apr 03 Javascript
jquery实现多条件筛选特效代码分享
Aug 28 Javascript
Vue.js每天必学之计算属性computed与$watch
Sep 05 Javascript
JavaScript模仿Pinterest实现图片预加载功能
Oct 25 Javascript
JavaScript模块化之使用requireJS按需加载
Apr 12 Javascript
vue 中swiper的使用教程
May 22 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
Jun 26 Javascript
js实现漂亮的星空背景
Nov 01 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
Sep 07 Javascript
Angular Material Icon使用详解
Nov 07 #Javascript
详解Webpack loader 之 file-loader
Nov 07 #Javascript
JS复杂判断的更优雅写法代码详解
Nov 07 #Javascript
javascript动态创建对象的属性详解
Nov 07 #Javascript
在vue中使用express-mock搭建mock服务的方法
Nov 07 #Javascript
详解在vue-test-utils中mock全局对象
Nov 07 #Javascript
vue-cli 首屏加载优化问题
Nov 06 #Javascript
You might like
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
PHP新手上路(五)
2006/10/09 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
2011/05/07 PHP
php 文件上传类代码
2011/08/06 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
jQuery 前的按键判断代码
2010/03/19 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
javascript控制台详解
2015/06/25 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
pymssql ntext字段调用问题解决方法
2008/12/17 Python
Python第三方库h5py_读取mat文件并显示值的方法
2019/02/08 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
python函数超时自动退出的实操方法
2020/12/28 Python
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
实现向右循环移位
2014/07/31 面试题
文明工地标语
2014/06/16 职场文书
学习十八大的心得体会
2014/09/12 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
2014年妇委会工作总结
2014/12/10 职场文书
工人先进事迹材料
2014/12/26 职场文书
个园导游词
2015/02/04 职场文书
色戒观后感
2015/06/12 职场文书
2015中秋祝酒词
2015/08/12 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
React配置子路由的实现
2021/06/03 Javascript