Skip to content

Commit 2c72470

Browse files
committed
docs: record problems encountered
1 parent 9ca2e63 commit 2c72470

File tree

3 files changed

+111
-5
lines changed

3 files changed

+111
-5
lines changed

README.md

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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/

src/miniprogram_npm/moment/index.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/miniprogram_npm/path-to-regexp/index.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)