前端单页相关规范

讨论稿

Posted by Joey on December 21, 2018

1、文件目录结构

/web/     前端目录
  srcstatic/dist/    
    index.html 前端单页入口文件,响应除/api/、favicon.ico、robots.txt和静态文件之外所有其他请求
favicon.ico 浏览器网址图标文件  
robots.txt 搜索引擎文件  
目录下的其他文件 前端所有静态资源文件(css, js, jpg, png, etc),对应url为 / (根目录)  
/public/ |   后端API目录  
| index.php   后端PHP入口文件,仅响应/api/前缀的URL  

2、PHP开发规范

1.PHP仅响应/api/前缀下的请求,所有路由以/api/为前缀

2.所有前端页面初始化时需要获取的数据,尽量使用一个API一次获取,比如GET /api/init_param

3.所有需要权限认证后方可访问的页面,在认证失败或未认证时,请直接在HTTP header上返回401

4.CSRF token检查失败时,需要返回code=custom_code.params_invalid.code,且info=”CSRF_TOKEN_FAILED” 注意:CSRF token请在登陆后使用/api/init_param返回给前端页面。

3、前端开发规范

1.前端响应所有请求(不含favicon、robots.txt 、/api/*和静态资源文件)。

2.前端初始化时,需要访问/api/init_param获取初始化数据,根据项目情况决定内容,一般包括是否已登录、CSRF token初始值等。

3.前端需要处理如下情况:请求了API之后,返回HTTP header 401错误(表示当前请求并未通过登录认证)。

4.前端需要处理如下情况:请求了method=POST的 API之后,返回json串中code=custom_code.params_invalid.code,且info=”CSRF_TOKEN_FAILED”的情况。 出现此情况表示当前登录的用户已经切换到另外一个用户id上,或者在其他浏览器标签页中登录退出又登录进来。

5.考虑到百度统计功能,在部署构建时,开发、测试和staging环境使用npm run test,正式环境使用npm run build:debug。脚本的区别是npm run build:debug会在单页中增加百度统计的相关代码。

Eslint规范

linebreak-style 换行符使用LF(line-feed, ASCII 10, \n)

no-alert, no-console, no-debugger 不能存在alert, console, debugger

quotes 字符串使用单引号

space-before-function-paren 大括号之前需要存在空格

block-scoped-var 块作用域定义的变量只能在块下使用

one-var, one-var-declaration-per-line 变量声明和定义都需要单行

no-multiple-empty-lines 文件最多连续两个空行, 文件头尾不能留空行

max-len code最多115单行,comment最多80字单行

max-depth 嵌套最多4层

max-params 参数最多5个

max-statements 变量连续声明不能超过20个

newline-after-var 变量声明/定义之后需要有空行

no-tabs 不能使用空格代替tab

indent 使用tab缩进

key-spacing 键值对前面不需要空格,后面需要加空格

brace-style if, function必须使用大括号, 不能单行

前端逻辑规范

1.变量的定义:

分为常量的定义和变量的定义;注:常量采用全大写字母,变量则采用驼峰式或小写进行命名;

如:


var CONTENT = 请输入姓名;

var flag = true;

2.自定义事件

用于当前页面的公共组件方法。

  1. Dom事件的定义

定义Dom的相关事件,包括click,mouseover等事件。

  1. 执行Dom事件

将Dom事件绑定在对应的标签上;

  1. 关键节点的检测

在模块化页面中,多个模块组成了一个页面。这里主要用于判断页面中是否存在某一模块;

  1. 获取常用节点

为了减少重复取用页面的节点,在这里将常用的节点存储起来,一般是存在数组中。

  1. 初始化事件定义区

页面初始化的定义区。

  1. 定义页面函数的执行入口。

  2. 执行入口函数。


define(function(require, exports){  

      //变量定义区,如下例:
      var Query = T.dom.query;

      var dom= T.dom;

      var node, nodes={};

      //自定义事件区,用于当前页面的公共组件方法
      var customedEvent = {

      }

      // Dom事件定义区
      var bindDOMFuns = {

      }

      //Dom事件的执行区
      var bindDOM = function () {

      }

      //关键节点检验区
      var argsCheck = function () {
          //示例代码
            if (!document.getElementById(element)) {
                 return;
            }
      }

      //获取常用节点区
      var getDomElements = function () {        

      }

      //初始化事件定义区
      var initPlugins = function () {

      }

      //执行入口
      var init = function () {        
         argsCheck();
          getDomElements();            
          initPlugins();               
          bindDOM();     
      };

      //执行
      init (); 
   })

Vue规范

    define(function(require){
    //自定义事件区,用于当前页面的公共组件方法
    var customedEvent = {

    };

    // vue事件定义区; vue的相关事件写在这个对象里 方便维护
    var vueEventList = {
        search: function () {

        }
   };

    // 超过十行写在vue数据区
    var vueData = {

    };

    // 初始化vue对象
    function initVue () {
        new Vue(
            el: '',
            data: vueData,
            methods: {
            search: vueEventList.search,
            addLine: vueEventList.addLine
        })
    }

    //初始化事件定义区
    var initPlugins = function () {

    };

    //执行入口
    var init = function () {
        initPlugins();
        initVue();
    };

    //执行
    init();
});

4、运维

4.1、Nginx配置 以beeper_customer_clue为例:

server {

listen 8530;
server_name localhost;

root /var/www/deploy/beeper_customer_clue/public;
index index.php index.html;

location ^~/api/ {
    try_files $uri $uri/ /index.php$is_args$query_string;
    break;
}

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

location / {
    root /var/www/deploy/beeper_customer_clue/web/srcstatic/dist/;
    try_files $uri /index.html;
}

access_log /var/log/nginx/beeper_customer_clue.access.log main;
error_log /var/log/nginx/beeper_customer_clue.error.log error;

}

4.2、环境要求

项目 要求版本
后端 根据项目要求,建议PHP5.6
前端-发布机 NodeJS 5.9+

4.3、部署脚本

环境 前端构建代码
testing npm install
staging npm install
production npm install

End

本文首次发布于 Joey Blog, 作者 @乔宇(Joey) ,转载请保留原文链接..