微信小程序使用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读取cookies)
Jan 11 Javascript
jQuery让控件左右移动的三种实现方法
Sep 08 Javascript
动态的创建一个元素createElement及删除一个元素
Jan 24 Javascript
javascript中String对象的slice()方法分析
Dec 20 Javascript
javascript中Array数组的迭代方法实例分析
Feb 04 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
Sep 17 Javascript
深入探讨前端框架react
Dec 09 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
Aug 29 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
Sep 22 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
Aug 18 jQuery
详解js的作用域、预解析机制
Feb 05 Javascript
从理论角度讨论JavaScript闭包
Apr 03 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并发对MYSQL造成压力的解决方法
2013/02/21 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
php实例化一个类的具体方法
2019/09/19 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
符合W3C网页标准的iframe标签的使用方法
2007/07/19 Javascript
js活用事件触发对象动作
2008/08/10 Javascript
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
chosen实现省市区三级联动
2018/08/16 Javascript
js实现导航跟随效果
2018/11/17 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
python的几种开发工具介绍
2007/03/07 Python
Python函数嵌套实例
2014/09/23 Python
李宁官方网店:中国运动品牌
2017/11/02 全球购物
自我鉴定怎么写
2014/01/12 职场文书
《巨人的花园》教学反思
2014/02/12 职场文书
入党积极分子群众意见
2015/06/01 职场文书
企业财务管理制度范本
2015/08/04 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
浅谈MySql整型索引和字符串索引失效或隐式转换问题
2021/11/20 MySQL