微信小程序使用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 相关文章推荐
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
Dec 08 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
Jul 17 Javascript
公共js在页面底部加载的注意事项介绍
Jul 18 Javascript
点击进行复制的JS代码实例
Aug 23 Javascript
Node.js(安装,启动,测试)
Jun 09 Javascript
EasyUI实现二级页面的内容勾选的方法
Mar 01 Javascript
js实现精美的图片跟随鼠标效果实例
May 16 Javascript
Vue.js 中的 $watch使用方法
May 25 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
Sep 13 Javascript
用vuex写了一个购物车H5页面的示例代码
Dec 04 Javascript
vue.js实现备忘录demo
Jun 26 Javascript
深入浅析JavaScript中的in关键字和for-in循环
Apr 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
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
PHP中对用户身份认证实现两种方法
2011/06/04 PHP
thinkphp缓存技术详解
2014/12/09 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
AngularJS实现表单元素值绑定操作示例
2017/10/11 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
Vue请求java服务端并返回数据代码实例
2019/11/28 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
讲解Python中的标识运算符
2015/05/14 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
python实现list由于numpy array的转换
2018/04/04 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
PyTorch安装与基本使用详解
2020/08/31 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
警察思想汇报
2014/01/04 职场文书
大学生如何写自荐信
2014/01/08 职场文书
社区消防工作实施方案
2014/03/21 职场文书
2015年端午节活动总结
2015/02/11 职场文书
电话营销开场白
2015/05/29 职场文书
秋菊打官司观后感
2015/06/03 职场文书