@@ -9,6 +9,108 @@ CNode 社区第三方微信小程序版本
99<img src =" ./preview/page_index.jpg " width =" 350 " title =" 首页 " /><img src =" ./preview/page_mine.jpg " width =" 350 " title =" 我的 " />
1010<img src =" ./preview/page_topic.jpg " width =" 350 " title =" 详情 " /><img src =" ./preview/page_about.jpg " width =" 350 " title =" 关于 " />
1111
12+ ## 踩到的坑
13+
14+ ### 1. npm支持 - 构建npm导致的问题
15+
16+ 1 . 由于需要格式化一些日期数据,于是选择了` moment `
17+
18+ 2 . 首先使用命令行,安装` moment `
19+ ``` shell
20+ # 打开小程序根目录
21+ cd src
22+ npm install --production moment
23+ ```
24+
25+ 3. 然后按照小程序文档往下操作,直到** 构建完成**
26+
27+ 4. 于是我们迫不及待的开始使用` moment`
28+ ` ` ` js
29+ import moment from ' moment' ;
30+
31+ let sFromNowText = moment(new Date () - 360000).fromNow ();
32+ console.log(sFromNowText);
33+
34+ // 控制台输出:" 6 minutes ago"
35+ ` ` `
36+
37+ 5. ` moment` 能够正常工作,但是很快我们发现英文不是我们想要的
38+
39+ 6. 于是我们找到` moment` 的[国际化配置][2],并` 设置全局语言为` 中文
40+ ` ` ` js
41+ import moment from ' moment' ;
42+ moment.locale(' zh-cn' );
43+
44+ let sFromNowText = moment(new Date () - 360000).fromNow ();
45+ console.log(sFromNowText);
46+
47+ // 可是控制台,依然输出:" 6 minutes ago"
48+ ` ` `
49+
50+ 7. 尝试输出` moment.locale` 执行后的返回值
51+ ` ` ` js
52+ // ...
53+ let sLang = moment.locale(' zh-cn' );
54+ console.log(sLang);
55+
56+ // 控制台输出:" en"
57+ ` ` `
58+
59+ 8. 发现设置语言环境失败了,经过排查和翻阅[小程序文档][1]后,发现通过微信开发者工具` 构建npm` 后,并不会将语言环境相关文件拷贝到` miniprogram_npm` 目录下,仅将入口js文件及其依赖的模块进行打包处理,进而导致加载中文语言环境失败。以下是摘自小程序文档的一段话:
60+ ` ` `
61+ 构建打包分为两种:小程序 npm 包会直接拷贝构建文件生成目录下的所有文件到 miniprogram_npm 中;其他 npm 包则会从入口 js 文件开始走一遍依赖分析和打包过程(类似 webpack)。
62+ ` ` `
63+
64+ 9. 快速查看了一下` moment` 源码,发现` moment.locale` 方法,会从` ./locale/` 目录下加载语言环境包,于是尝试手动从` node_modules/moment/` 目录下,将中文语言环境包,拷贝到` miniprogram_npm` 目录下
65+ ` ` ` js
66+ // moment.js
67+ // ...
68+ function loadLocale(name) {
69+ // ...
70+ var aliasedRequire = require;
71+ aliasedRequire(' ./locale/' + name);
72+ // ...
73+ }
74+ // ...
75+ ` ` `
76+
77+ 10. 经过调试发现,` moment` 定义语言环境时出错,原来是由于` 构建npm` 导致入口文件(` moment.js` )经过打包后更名为` index.js` 导致:` Error: module " miniprogram_npm/moment/moment" is not defined`
78+ ` ` ` js
79+ // zh-cn.js
80+ (function(global, factory) {
81+ typeof exports === ' object' && typeof module ! == ' undefined' && typeof require === ' function'
82+ ? factory(require(' ../moment' ))
83+ : typeof define === ' function' && define.amd
84+ ? define([' ../moment' ], factory)
85+ : factory(global.moment);
86+ })(this, function(moment) {
87+ ' use strict' ;
88+
89+ var zhCn = moment.defineLocale(' zh-cn' , {
90+ // ...
91+ });
92+
93+ return zhCn;
94+ });
95+ ` ` `
96+
97+ 11. 果然手动将` ' ../moment' ` 统一改为` ' ../index' ` ,然后重新执行
98+ ` ` ` js
99+ import moment from ' moment' ;
100+ moment.locale(' zh-cn' );
101+
102+ let sFromNowText = moment(new Date () - 360000).fromNow ();
103+ console.log(sFromNowText);
104+
105+ // 现在控制台,输出:" 6 分钟前"
106+ ` ` `
107+
108+ 12. 大功告成,nice! 但也别忘了回过头来,总结一下导致这几个问题的原因:
109+ 1. ` 构建npm` 会将npm包的入口文件(eg: moment.js),打包后更名为` index.js`
110+ 2. ` 构建npm` 仅将npm包的入口js文件及其依赖的模块进行打包处理,并不会将该npm包下一些可选的文件(eg: moment的语言环境包)拷贝到` miniprogram_npm` 目录下
111+
112+ > ` miniprogram_npm` 、` 构建npm` 及更多npm支持相关信息,请翻阅[小程序文档-npm支持][1]
113+
12114# # 命名规范
13115
14116项目中变量命名,采用数据类型显式声明的方式
@@ -34,4 +136,8 @@ let oTodo = {
34136};
35137` ` `
36138
37- > 不确定数据类型的变量,没有强制遵循
139+ > 不确定数据类型的变量,没有强制遵循
140+
141+
142+ [1]: https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html
143+ [2]: http://momentjs.cn/docs/# /i18n/
0 commit comments