微信小程序使用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 相关文章推荐
asp.net和asp下ACCESS的参数化查询
Jun 11 Javascript
javascript Onunload与Onbeforeunload使用小结
Dec 31 Javascript
js模仿hover的具体实现代码
Dec 30 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
Dec 10 Javascript
jQuery+ajax简单实现文件上传的方法
Jun 03 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
Nov 11 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
Dec 11 jQuery
vue项目中axios请求网络接口封装的示例代码
Dec 18 Javascript
vue路由跳转传参数的方法
May 06 Javascript
微信小程序HTTP接口请求封装代码实例
Sep 05 Javascript
浏览器JavaScript调试功能无法使用解决方案
Sep 18 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
Jan 29 Vue.js
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字符串 ==比较运算符的副作用
2009/10/21 PHP
php中随机显示图片的函数代码
2011/06/23 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
python的re模块应用实例
2014/09/26 Python
Python 26进制计算实现方法
2015/05/28 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
python traceback捕获并打印异常的方法
2018/08/31 Python
python日期相关操作实例小结
2019/06/24 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
小学教师管理制度
2014/01/18 职场文书
挂职自我鉴定
2014/02/26 职场文书
共产党员公开承诺书
2014/03/25 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
英语辞职信怎么写
2015/02/28 职场文书
音乐教师求职信范文
2015/03/20 职场文书
廉洁自律承诺书2016
2016/03/25 职场文书
我去timi了,一起去timi是什么意思?
2022/04/13 杂记