JS 篇

编码优化

使用 ES6 规范编码

  • ECMAScript 6 入门

  • 善于利用解构

      1. const { itemTitle, itemImg } = item;
  • 不使用 commonjs 的规范引用和导出

      1. const $ = require('@ali/mui-zepto/zepto');
      2. module.exports = $;
      1. import $ from '@ali/mui-zepto/zepto';
      2. export default $;
  • 建议使用 async await 处理异步

    • ``` async function timeout(ms) { await new Promise((resolve) => { setTimeout(resolve, ms); }); }

    async function asyncPrint(value, ms) { await timeout(ms); console.log(value); }

    asyncPrint(‘hello world’, 50); ```

关于 zepto 部分

  • 无线端不建议使用 zepto,建议使用原生 API 替代

  • 原因:

    • 目前无线端原生 API 的兼容性足够好

    • 长期在 zepto 和 原生 API 之间来回切换会容易产生 bug

      • case: $(box)[0]this.box[0] 混淆导致 lazyload 绑定对象查询失败,绑定到 body 上

常用原生 API

摘自 You-Dont-Need-jQuery

zepto 写法 原生 备注
$(‘selector’); document.querySelectorAll(‘selector’);
$(‘selector’).first(); document.querySelector(‘selector’);
$(‘selector’, box).first(); box.querySelector(‘selector’); 最常用的写法,携带查询 scope
$el.attr(‘foo’); el.getAttribute(‘foo’);
$el.attr(‘foo’, ‘bar’); el.setAttribute(‘foo’, ‘bar’);
$el.css({ color: ‘#f01’ }); el.style.color = ‘#f01’;
$el.addClass(className); el.classList.add(className);
$el.removeClass(className); el.classList.remove(className);
$el.hasClass(className); el.classList.contains(className);
$el.toggleClass(className); el.classList.toggle(className);
$(window).scrollTop(); (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop; 常见的兼容写法
$el.remove(); el.parentNode.removeChild(el); 常见的兼容写法
$el.html(htmlString); el.innerHTML = htmlString;
$el.on(eventName, eventHandler); el.addEventListener(eventName, eventHandler);
$.now(); Date.now();

常见问题

  • 获取浏览器高度

      1. // 不含 scrollbar
      2. window.innerHeight;
  • 获取元素高度

    • ``` // Native function getHeight(el) { const styles = this.getComputedStyle(el); const height = el.offsetHeight; const borderTopWidth = parseFloat(styles.borderTopWidth); const borderBottomWidth = parseFloat(styles.borderBottomWidth); const paddingTop = parseFloat(styles.paddingTop); const paddingBottom = parseFloat(styles.paddingBottom); return height - borderBottomWidth - borderTopWidth - paddingTop - paddingBottom; }

    // 精确到整数(border-box 时为 height - border 值,content-box 时为 height + padding 值) el.clientHeight;

    // 精确到小数(border-box 时为 height 值,content-box 时为 height + padding + border 值) el.getBoundingClientRect().height; ```

常见错误代码

  • 有 if 就要有对应的 else 逻辑

  • for 循环内针对数组长度进行缓存,避免重复计算

不要使用 请使用
location.href window.location.href
setTimeout 使用 async await Promise
‘htmlString’ 使用反引导`
$el.css({ color: ‘#f01’ }); 或 el.style.color = ‘#f01’; 定义类,添加或删除类
开头 import 结尾 module.exports 纯粹的 ES 模块导入导出规范
localStorage.getItem try … catch 避免隐身模式问题

命名规范

  • 组件类采用首字母大写方式定义

    • 原因:这样在调试阶段可以显式在控制台打印出对应大写类名,利于排查错误。
  1. pmod-zebra-module
  2. ├── README.md
  3. ├── node_modules
  4. ├── package.json
  5. ├── .gitignore
  6. ├── tap.conf.js
  7. └── src
  8. ├── xtpls
  9. ├── App.less
  10. ├── App.js
  11. ├── App.xtpl
  12. ├── index.less
  13. └── index.js
  • 事件绑定名称定义

    • handleXXX,如:handleClick handleInputChange 等
  • 能用 const 的地方就不用 let

  • 变量名不能出现拼音,为了准确表达,尽量使用长变量名

生产工具推荐

  • 代码格式化 prettier

    • 代码优化小记 - 图1

    • 相关配置:

        1. "prettier.singleQuote": true, // 使用单引号
        2. "prettier.trailingComma": "es5", // 末行数组带逗号
  • 编辑器

    • 建议使用 vscode

    • 插件推荐

      • GitLens

      • Import Cost

性能优化

passive event

样式篇

常用配置

统一盒模型

  1. html {
  2. box-sizing: border-box;
  3. }
  4. *, *::before, *::after {
  5. box-sizing: inherit;
  6. }

最末元素样式

  1. .nav li:not(:last-child) {
  2. border-right: 1px solid #666;
  3. }

移除滚动条

  1. ::-webkit-scrollbar {
  2. display: hidden;
  3. }

居中设置

  1. .flexbox-centering {
  2. display: flex;
  3. justify-content: center;
  4. align-items: center;
  5. }

使用系统字体

  1. .system-font-stack {
  2. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu,
  3. Cantarell, 'Helvetica Neue', Helvetica, Arial, sans-serif;
  4. }

多行文本

  1. .multi-line-text {
  2. overflow: hidden;
  3. display: -webkit-box;
  4. -webkit-box-orient: vertical;
  5. -webkit-line-clamp: 2;
  6. text-overflow: ellipsis;
  7. }

便捷开发

使用 vw

普通方式

  • postcss-px-to-viewport 插件

  • 配置参数

      1. {
      2. viewportWidth: 750,
      3. viewportHeight: 1334,
      4. unitPrecision: 3,
      5. viewportUnit: 'vw',
      6. selectorBlackList: ['.ignore', '.hairlines'],
      7. minPixelValue: 1,
      8. mediaQuery: false
      9. }

脚手架快捷方式

使用 @ali/tap-template-zebra-module-h5-vw 替换 @ali/tap-template-zebra-module-h5

  1. module.exports = {
  2. isAliIntranet: true,
  3. template: {
  4. module: '@ali/tap-template-zebra-module-h5-vw',
  5. sv: '^5.0.0',
  6. },
  7. };

规范约定

z-index

  • 最顶层:999999 (modal)

  • 页头:1099

  • 二级页头:1000 1010 1020 (参考 bootstrap 规范)

  • 购物车:999

  • 其他:1 2 3

常用工具

SVG 压缩

https://jakearchibald.github.io/svgomg/

模板篇

组件化

LESS 部分

  • 定义组件 scope

  • 样式层级不超过 3 层

  • 使用响应单位

  1. .zebra-jinkou-item {
  2. width: 30.8vw;
  3. display: block;
  4. overflow: hidden;
  5. position: relative;
  6. background-color: #fff;
  7. &-img {
  8. width: 30.8vw;
  9. height: 30.8vw;
  10. }
  11. &-title {
  12. color: #333333;
  13. font-size: 3.2vw;
  14. height: 9.6vw;
  15. line-height: 4.8vw;
  16. display: -webkit-box;
  17. -webkit-line-clamp: 2;
  18. overflow: hidden;
  19. text-overflow: ellipsis;
  20. -webkit-box-orient: vertical;
  21. }
  22. }

XTPL 部分

  • a 标签设置 target="_blank"

  • 尽量不使用 id

  • 为每个元素添加语义化的类,并处理好 scope

  1. {{#each(itemList)}}
  2. <a data-id="{{itemId}}" class="zebra-jinkou-item" href="{{itemUrl}}" target="_blank">
  3. {{/each}}

JS 部分

  • 引用样式

  • 引用异步模板

  • 导出函数

  1. import './item.css';
  2. import itemTpl from './item.xtpl';
  3. export default itemTpl;

Git 篇

Commit 规范

工具参考:http://marionebl.github.io/commitlint/#/

Commit type

  • feat:新功能(feature)

  • fix:修补bug

  • docs:文档(documentation)

  • style: 格式(不影响代码运行的变动)

  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)

  • test:增加测试

  • chore:构建过程或辅助工具的变动

Commit 范例

  • 增加了点击方法: feat: add click listener

  • 修复了点击事件:fix: click handler

  • 预发测试:test: slide swiper

  • 改了下格式:style: remove space

  • 不知道选什么类型:chore: balabala

推荐使用英文 Commit,方便检索,利于与外语开发者合作。

PR 规范

  1. 在原有仓库 master 上 checkout 分支,名称如:feat/dynamic-render fix/item-template

  2. 修改代码,不破坏原有的格式,不进行构建

  3. 提交代码,向 master 分支发起 PR

  4. 填写详细的变更情况