微信小程序使用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工具 Cookie 封装
Aug 21 Javascript
filters.revealTrans.Transition使用方法小结
Aug 19 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
Jun 21 Javascript
js实现广告漂浮效果的小例子
Jul 02 Javascript
Jquery 获取对象的几种方式介绍
Jan 17 Javascript
javascript三元运算符用法实例
Apr 16 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 Javascript
canvas 弹幕效果(实例分享)
Jan 11 Javascript
Bootstrap模态对话框中显示动态内容的方法
Aug 10 Javascript
爬虫利器Puppeteer实战
Jan 09 Javascript
javascript操作向表格中动态加载数据
Aug 27 Javascript
如何开发一个渐进式Web应用程序PWA
May 10 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带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
10 个经典PHP函数
2013/10/17 PHP
js玩一玩WSH吧
2007/02/23 Javascript
Javascript this关键字使用分析
2008/10/21 Javascript
一个javascript图片阅览组件
2010/11/09 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
jQuery:unbind方法的使用详解
2017/08/14 jQuery
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
Python 随机生成中文验证码的实例代码
2013/03/20 Python
python 简单的绘图工具turtle使用详解
2017/06/21 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
金融行业务员的自我评价
2013/12/13 职场文书
《小池塘》教学反思
2014/02/28 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
银行金融服务方案
2014/06/11 职场文书
员工安全责任书范本
2014/07/24 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
学校端午节活动总结
2015/02/11 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
员工工作心得体会
2019/05/07 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书