微信小程序使用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 相关文章推荐
jquery.ui.progressbar 中文文档
Nov 26 Javascript
单独使用CKFinder选择图片的方法
Aug 21 Javascript
extjs中form与grid交互数据(record)的方法
Aug 29 Javascript
jQuery 获取和设置select下拉框的值实现代码
Nov 08 Javascript
angularjs的一些优化小技巧
Dec 06 Javascript
详解微信小程序——自定义圆形进度条
Dec 29 Javascript
Three.js中网格对象MESH的属性与方法详解
Sep 27 Javascript
动手写一个angular版本的Message组件的方法
Dec 16 Javascript
微信小程序实现日历功能
Nov 27 Javascript
Vue.js中 v-model 指令的修饰符详解
Dec 03 Javascript
Node 搭建一个静态资源服务器的实现
May 20 Javascript
Vuex,iView UI面包屑导航使用扩展详解
Nov 04 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 高手之路(三)
2006/10/09 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
2011/12/26 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
2019/11/13 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
深入理解Python装饰器
2016/07/27 Python
Python实现的双色球生成功能示例
2017/12/18 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
Python内置函数及功能简介汇总
2020/10/13 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
前端canvas动画如何转成mp4视频的方法
2019/06/17 HTML / CSS
教师实习期自我鉴定
2013/10/06 职场文书
学校十一活动方案
2014/02/01 职场文书
教育技术学专业职业规划书
2014/03/03 职场文书
元旦联欢会主持词
2014/03/26 职场文书
革命电影观后感
2015/06/18 职场文书
信用卡工资证明范本
2015/06/19 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
Python FuzzyWuzzy实现模糊匹配
2022/04/28 Python