Archives for : 前端

第1205天:TaroUI 不太稳

今天使用 WebView,报这个错:

Template `tmpl_0_67` not found

前几天也有遇到类似问题,添加这段配置可以解决:

compiler: {
type: ‘webpack5′,
prebundle: {
exclude: ['taro-ui']
}
}

而 WebView 这个问题,社区连 issue 都搜不到。TaroUI 开发交流群也比较冷清。

Taro 在维护,而 TaroUI 看起来已经被抛弃,导致不兼容。

还好早发现,没陷太深。果断弃坑。

第1166天:重新安装 cnpm 的坑

三四年没有碰 npm,发现 cnpm 几年前就改了域名,原来的已经不能再使用。

不知道咋回事,npm 和 cnpm 都用不了,重装 node 和升级 node 都没用,单独升级 npm 也升级不了。

最后发现重装 cnpm 就行了。

不过直接 install cnpm 也不行,安装失败,需要先 uninstall,然后再 install.

这坑,必须 mark 一下。

npm uninstall -g cnpm

npm install -g cnpm –registry=https://registry.npmmirror.com

第1162天:Git工作流规范

写了一份 Git 工作流规范,方便团队协作。

基础分支(不要直接在这两个分支上开发)

  • develop (开发环境)
  • master (生产环境,主分支)

工作流基础

  • feature (开发分支,从 develop 拉取)
  • release (预发布分支,从 develop 拉取)
  • hotfix (补丁分支,从 master 拉取)
  • merge (合并分支)

第一部分:开发

创建个人开发分支

  • 开始新功能开发时,每个人都基于 develop 创建一个新的 feature 分支,这个 feature 不会影响他人。
  • 每天提交代码到自己的 feature,避免本地代码意外丢失。

同事之间同步代码

  • 每天都把 develop 分支 merge 到你的分支。如果长时间没有进行这项操作,那么将来 merge 分支时很可能会有大量代码冲突。
  • 如果确认你分支的代码已经可以正常运行,记得把你的分支 merge 到 develop。
  • 如果有需要,同事之间也可以互相 merge 分支,你 merge 我的,我 merge 你的。

解决代码冲突(这个很重要)

  • 如果 merge 分支时发生代码冲突,一定要找冲突方确认。
  • 群里截图问一下这段代码是谁的,双方确认后手动解决,避免误删同事代码。

第二部分:测试

  • 所有人把自己的分支合并到 develop 分支,将 develop 代码提交到测试环境进行测试。
  • 如果有 bug,大家仍然在自己的分支中修改,修改完后再 merge 到 develop 分支。

第三部分:预发布

  • 所有人把自己的分支合并到 develop 分支,由专人从 develop 拉 release 分支,进行发布前的最后测试。
  • 此时应该没有大的问题,如果有问题,大家可直接在 release 分支修改。

第四部分:发布

  • release 分支确认最终测试通过后,由专人将 release 合并到 develop 和 master 分支,将 master 发布上线。
  • 到这一步后,此前参与开发的所有分支都不要再使用,可以删除本地分支。新的功能拉取新的 feature 进行开发。

第五部分:bug修复

  • 如果需要修复线上 bug,从 master 拉取 hotfix 分支,修复完成后合并到 develop 和 master 分支,将 master 发布上线。

第1111天:react mobx 监听数组变化的两个注意点

mobx 监听数组变化,有时可以,有时不行,今天才看出名堂,迟钝。

1. 用 splice 改变数组,mobx 可以直接刷新数据,比如:

myList.splice(index, 1, newItem)

2. 这点很重要。如果要把列表项作为 react 组件,需要把整个列表作为一个组件,而不是把一个 item 作为组件。

以上两点,第 2 点尤其要注意。

小程序 web-view 内嵌的 h5 调用微信头像和昵称

连踩了好几个大坑,太深,记录一下。

小程序端 (wepy)

const userInfo = this.$parent.globalData.userInfo
// 参数值需要用 encodeURIComponent 进行编码
const nickName = encodeURIComponent(userInfo.nickName)
const avatarUrl = encodeURIComponent(userInfo.avatarUrl)
// 不能使用 # 字符拼接参数,在真机微信上会报错,推荐使用 ?...&...
this.src = `result?nickName=${nickName}&avatarUrl=${avatarUrl}`

h5 端 (vue)

const paramStr = window.location.href.split('?nickName=')[1]
if (paramStr) {
  const param = paramStr.split('&avatarUrl=')
  // 使用 decodeURIComponent 解码
  this.nickName = decodeURIComponent(param[0])
  this.avatarUrl = decodeURIComponent(param[1])
}

最后,使用 <img/> 在真机预览时显示不了图像,就算调用同域名下的远程图像也显示不了,正确的姿势是使用 background .

PS:用 vue + wepy 开发小程序很完美。

next.js 的一些坑

971bf7f8-9ac0-11e6-975c-188defd82df1

这阵子在折腾 next.js,用来做 node 服务端渲染真心不错,然而一路捣腾下来,坑也是不少,有四个比较大的坑。

  1. isomorphic-fetch(解决)
  2. node 端代码打包(未解决)
  3. js 放到 cdn 或者 oss(解决)
  4. static 目录下的图片 hash(临时方案)

这四个坑,1 和 3 是必须解决的,2 和 4 可选。

1

fetch 本来不是什么问题,但是涉及到请求签名,就来了点麻烦,需要区分是服务端还是客户端,客户端用 cookie 存储 token,服务端用变量。

2

node 代码其实不需要打包,因为是运行在服务端,不过为了节省 docker 镜像的大小,尝试了打包,主要是想把 node_modules 也打包进去。先是用 webpack,能打包成功,但是运行失败。后面又用 rollup,同样是打包成功,运行失败。可能是因为 nextjs 本身就包含了 webpack,而用打包工具来打包自己,估计 webpack 和 rollup 都没有想过会有这样的场景出现。于是放弃。

3

这个比较坑,所以重点说一下。

nextjs 提供了 assetPrefix 参数,但是这个参数基本没什么用。需要解决两个问题,一是打包目录要把 hash 带进去,把原来的 bundles/pages/xxx.js 目录结构改成 [hash]/xxx.js,这一步可以在打包脚本里处理,通过 BUILD_ID 和 build-stats.json 拿到 hash,直接上代码:

rm -r -f build
mkdir build

# move pages
buildId=$(cat _next/BUILD_ID)
mkdir build/${buildId}
mv _next/bundles/pages/* build/${buildId}
rm -r _next/bundles

# move app.js
appHash=$(cat _next/build-stats.json)
appHash=${appHash#*hash\":\"}
appHash=${appHash%\"*}
mv _next/app.js build/app.${appHash}.js

其中,_next 是 nextjs 的 distDir,build 是需要上传到 cdn 的目录。

接下来在 server.js 里重写 router,用了 express,参考 https://github.com/zeit/next.js/issues/257

const cdnPrefix = 'https://mycdn.com'

server.use('/_next/**/app.js', (req, res) => {
  const appHash = req.originalUrl.replace('/_next/', '').replace('/app.js', '')
  const newUrl = `${cdnPrefix}/build/app.${appHash}.js`
  res.redirect(newUrl)
})

server.use('/_next/**/page/**', (req, res) => {
  const buildHash = req.originalUrl.replace('/_next/', '').replace(/\/page\/.*/, '')
  const pageName = req.originalUrl.replace(/.*page\//, '') || 'index'
  const newUrl = `${cdnPrefix}/build/${buildHash}/${pageName}.js`
  res.redirect(newUrl)
})

4

static 目录下的图片 hash,这个问题也比较次要,暂时可以通过 githooks 来处理图片修改的问题,对于图片只允许增量提交。

.git/hooks/pre-commit

#!/bin/sh
STAGED_IMAGES=$(git diff --cached --name-only --diff-filter=M | grep -E ".(jpg|jpeg|png|gif)$")

if [[ $STAGED_IMAGES ]]; then
  echo $STAGED_IMAGES
  exit 1
fi

还有一些小坑,比如 process.env.NODE_ENV 的问题(如果有三种以上的环境),比如 scss 里面因不同环境插入不同 cdn 地址图片的问题,等等,就不列了。

生产项目:https://www.isspu.com

webpack 的 DllPlugin 很厉害

webpack.dllplugin.powerful

我们的打包机比较烂,所以想尽办法优化打包速度,这次使用了 DllPluginhappypack 进行优化(主要的功臣是 DllPlugin),速度明显提升,效果显著。

生产环境

  • 优化前 ≈ 125 秒
  • 优化后 ≈ 55 秒
  • 提升 ≈ 56%

大约是 DllPlugin 减了 50 秒,happypack 减了 20 秒。

开发环境

  • 优化前 ≈ 40 秒
  • 优化后 ≈ 15 秒
  • 提升 ≈ 62.5%
  • 热构建从 4 秒缩短到 2 秒

小程序审核越来越快了

IMG_4476

(图:等待审核只用了 41 分钟)

回想第一次审核通过,等了三天,春节过后的审核速度一次比一次快,今天又刷新纪录,只用了 41 分钟,不知道是好事还是坏事。往往看起来是个好事的事,不见得就是啥好事。

回归 express

express4-15

用 koa 踩了一些坑后,决定回归 express,等 koa 生态起来以后再用。

再看 express 最近的几次更新,好像今年突然有变勤快的趋势。

Release Change Log

4.15.0 – Release date: 2017-03-01
4.14.1 – Release date: 2017-01-28
4.14.0 – Release date: 2016-06-16

http://expressjs.com/en/changelog/4x.html

如今写本前端书真不容易

WechatIMG30

(图:《Node.js 硬实战》)

新书到手,啪啪啪翻了下,看到一段,说当时写这本书时 grunt 正流行,然后提到了 gulp。心想,如今写本技术书真心不容易,等你写出来的时候,已经过时了,尤其是前端书。