微信小程序使用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 相关文章推荐
为原生js Array增加each方法
Apr 07 Javascript
js鼠标及对象坐标控制属性详细解析
Dec 14 Javascript
快速解决jQuery与其他库冲突的方法介绍
Jan 02 Javascript
jquery 删除字符串最后一个字符的方法解析
Feb 11 Javascript
jQuery中prepend()方法使用详解
Aug 11 Javascript
js实现温度计时间样式代码分享
Aug 21 Javascript
jquery读写cookie操作实例分析
Dec 24 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
May 16 Javascript
bootstrap学习笔记之初识bootstrap
Jun 21 Javascript
JS区分Object与Aarry的六种方法总结
Feb 27 Javascript
JavaScript函数柯里化原理与用法分析
Mar 31 Javascript
Angular 4环境准备与Angular cli创建项目详解
May 27 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
利用PHP动态生成VRML网页
2006/10/09 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
JS代码放在head和body中的区别分析
2011/12/01 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
jQuery插件MixItUp实现动画过滤和排序
2015/04/12 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
vant中的toast层级改变操作
2020/11/04 Javascript
[04:00]黄浦江畔,再会英雄——完美世界DOTA2 TI9应援视频
2019/07/31 DOTA
python绘图库Matplotlib的安装
2014/07/03 Python
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
方正Java笔试题
2014/07/03 面试题
机关单位动员会主持词
2014/03/20 职场文书
专家推荐信模板
2014/05/09 职场文书
宣传普通话标语
2014/06/27 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
校车安全责任书
2014/08/25 职场文书
高一军训的心得体会
2014/09/01 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
Python实现单例模式的5种方法
2021/06/15 Python
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python