微信小程序使用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里的this关键字的理解
Aug 17 Javascript
JavaScript函数节流概念与用法实例详解
Jun 20 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
Jul 06 Javascript
JavaScript实现公历转农历功能示例
Feb 13 Javascript
JS倒计时实例_天时分秒
Aug 22 Javascript
bootstrap实现二级下拉菜单效果
Nov 23 Javascript
vuex操作state对象的实例代码
Apr 25 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
Nov 13 Javascript
使用JS location实现搜索框历史记录功能
Dec 23 Javascript
JS Thunk 函数的含义和用法实例总结
Apr 08 Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
微信小程序连续签到7天积分获得功能的示例代码
Aug 20 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
Wordpress php 分页代码
2009/10/21 PHP
解析link_mysql的php版
2013/06/30 PHP
php实现加减法验证码代码
2014/02/14 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
python使用marshal模块序列化实例
2014/09/25 Python
Python实现把xml或xsl转换为html格式
2015/04/08 Python
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
Python列表切片操作实例总结
2019/02/19 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
Python3 集合set入门基础
2020/02/10 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
印尼太阳百货公司网站:Matahari
2018/02/04 全球购物
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
Ajax和javascript的区别
2013/07/20 面试题
2014年乡镇妇联工作总结
2014/12/02 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
学生病假条怎么写
2015/08/17 职场文书
校运会班级霸气口号
2015/12/24 职场文书