-
Notifications
You must be signed in to change notification settings - Fork 115
FECS
运行于 Node.js 环境,因此需要保证已经安装 Node.js 之后再执行以下命令:
$ [sudo] npm install fecs -g
如果安装失败报权限相关的问题,请使用 sudo
。
由于修复后的代码生成使用 escodegen
,它将忽略源码中的空行,因此格式化后的代码将会缺少原有的空行(相关讨论),目前暂无解决方案,后续将由 jformatter
提供规则,根据相应规则为某些 statement 前或后增加空行的方式,以保证代码的可读性,目前社区有相应的实现:esformatter,目前已经使用 esformatter 作最后步骤的格式化。
ESLint
大部分给出的是关于代码风格或有安全隐患方面的问题,一般没有特殊情况的话,还是全部都修复掉。但是只要理由充分,可以自行配置忽略某部分代码的问题。
可以在项目根目录创建 .eslintrc
.fecsrc
文件,配置项将会覆盖 FECS
的默认值。FECS
默认针对的是 Web 项目,对于 node 项目,需要更改的配置如下:
{
"eslint": {
"env": {
"node": true,
"browser": false
},
"rules": {
"no-console": 0
}
}
}
如果只是某些文件需要 特殊照顾
,可以在文件头使用 /* eslint-disable ruleName */
来配置。
/* eslint-env node */
/* eslint-disable no-console */
部分代码的解决方式与文件类似,但是在代码结束的地方需要再恢复规则。
/* eslint-disable fecs-max-statements */
//
// 这里是不可分割的算法代码,但是超出默认的 50 statement
//
/* eslint-enable fecs-max-statements */
与上一个问题类似,在 .fecsrc
中使用 globals 字段配置,示例中假设要标识的全局变量名为 nirvana:
{
"eslint": {
"env": {
"node": true,
"browser": false
},
"globals": {
"nirvana": true
},
"rules": {
"no-console": 0
}
}
}
或者在文件中使用注释标识:
/* globals nirvana */
适用于常见的报错信息:
JS070 [强制] 变量在使用前必须通过
var
定义。
比如需要编程方式使用 FECS
的检查结果,需要有更好的格式支持,此时可以使用 format
参数来指定格式,同时配合使用 silent
:
$ fecs --silent --format=json
目前支持的格式有 JSON
、XML
与 HTML
。
目前的方法是使用 ignore
参数:
$ fecs --ignore='**/cli/**'
使用的是 glob
的 pattern,如果有多个 pattern,可以写多个 ignore
:
$ fecs --ignore='**/cli/**' --ignore='**/foo.js'
同时也可以使用 .fecsignore
文件来配置类似 Git
方式的 .gitignore
忽略规则。
有这个计划,联盟研发部
的高工 李玉北
正在开发相关的支持,未来将支持以下 IDE/Editor:
- VIM
- WebStorm
- Eclipse
- Sublime Text 2/3 Baidu FE Code Style Sublime Helper SublimeLinter-contrib-fecs
- Visual Studio Code fecs-visual-studio-code VScode-fecs
- Atom
目前正在计划开发 Eclipse 的版本已提供 Eclipse 的插件支持。
主要是由于检测到非当前文件定义的变量(全局变量),在确定不是拼写错误之后,只要把变量标识为 globals 即可,标识方法参考上面的 如何忽略某个错误?
。由于 eagle
的限制,提交 SVN
的项目建议使用文件级别的忽略,GIT
的项目可以使用项目级别的配置。
比如下面的代码:
javascript
var table = $('foo').DataTable({});
根据规范,只允许构造函数的首字母大写。而对构造函数的调用,需要使用 `new` 操作符。因为上面的代码可以改成以下三种方式:
```javascript
// 第一种方式,增加 new 操作符
// 注意不能在上面的代码中直接加 new,否则 new 的是 $
var el = $('foo');
var table = new el.DataTable({});
// 第二种方式
var DataTable = $('foo').DataTable;
var table = new DataTable({});
// 第二种方式
var dataTable = $('foo').DataTable
var table = dataTable({});
-
常见的原因是使用了
tab
作缩进,这在 cooder 上查看时表现为一个个小圆点,与space
的空白是有区别的。 -
另外一个常见的原因是由于前面的旧代码缩进数不错,导致后面的缩进数检查错误。
-
比较难排查的是数组直接量的缩进。通常数组直接量内元素,要么全部写在一行,如果出现元素间换行,
[
后和]
前必须有换行。当使用数组直接量作为 HTML 字符拼接时,相邻元素间允许差 0 或 1 个缩进。
-
默认格式化后的代码会保存在项目的
output
目录下,可以通过--output
参数来指定输出的目录,也可以使用--replace
参数来直接替换源文件。当--output=.
或--output=./
时也会直接替换源文件。 -
如果被格式化的文件出现语法错误,也是会导致没效果的。
-
对于 CSS 文件,如果使用了针对 IE 的
expression
,虽然没有语法错误,但是由于csscomb
使用的gonzales-pe
的限制,也会导致格式化出错从而看不到效果。
- 首先需要通过
jumbo
安装nodejs
:
$ jumbo install nodejs
建议安装 4.x
以上版本。
- 再以指定
registry
的方式安装fecs
:
$ npm i -g fecs --registry=http://npm.internal.baidu.com
如果安装失败,建议多尝试几次。
在 [email protected]
之前的版本只能检查 .js
扩展名的代码,之后的版本需要显示指定 --type
参数,并且包含 es6
的取值才行。
// Learn TypeScript: // - https://docs.cocos.com/creator/manual/en/scripting/typescript.html // Learn Attribute: // - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html // Learn life-cycle callbacks: // - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
import AssetMgr from './framework/AssetMgr'; import AudioMgr from './framework/AudioMgr'; import EventMgr from './framework/EventMgr'; import ObjectPoolMgr from './framework/ObjectPoolMgr'; import TimerMgr from './framework/TimerMgr'; import UIMgr from './framework/UIMgr'; import Instance from './framework/utils/Instance'; import PropMgr from './logic/common/PropMgr'; import UserInfo from './logic/common/UserInfo'; import ArtDataMgr from './logic/data/ArtDataMgr'; import ConfigArtGroupMgr from './logic/data/ConfigArtGroupMgr'; import ConfigArtMgr from './logic/data/ConfigArtMgr'; import ConfigMgr from './logic/data/ConfigMgr'; import SaveDataMgr from './logic/data/SaveDataMgr'; import HttpLogicMgr from './logic/net/HttpLogicMgr'; import GridMgr from './logic/painting/GridMgr'; import PaintingGridDataMgr from './logic/painting/PaintingGridDataMgr'; import PaintingPaletteDataMgr from './logic/painting/PaintingPaletteDataMgr'; import StarBlinkEffectMgr from './logic/ui/effects/StarBlinkEffectMgr';
const { ccclass, property } = cc._decorator;
@ccclass export default class App extends cc.Component { static UIRoot: cc.Node = null; static timerMgr: TimerMgr = null; static eventMgr: EventMgr = null; static assetMgr: AssetMgr = null; static uiMgr: UIMgr = null; static poolMgr: ObjectPoolMgr = null; static httpMgr: HttpLogicMgr = null; static audioMgr: AudioMgr = null; static userInfo: UserInfo = null; static gridMgr: GridMgr = null; static paintingPaletteDataMgr: PaintingPaletteDataMgr = null; static saveDataMgr: SaveDataMgr = null; static paintingGridDataMgr: PaintingGridDataMgr = new PaintingGridDataMgr(); static propMgr: PropMgr = null; static artDataMgr: ArtDataMgr = null; private static configMgr: ConfigMgr = null; static configArtMgr: ConfigArtMgr = null; static configArtGroupMgr: ConfigArtGroupMgr = null;; /** * 测试网络开关 / static isOpenNetwork: boolean = true; /* * 是否是链接本地 / static isLocalNetwork: boolean = true; /* * 是否开启网络log */ static isOpenNetworkLog: boolean = true;
async onLoad() {
App.UIRoot = cc.find('Canvas/UIRoot');
// cc.debug.setDisplayStats(false);
// cc.game.setFrameRate(30)
// 注册单例
App.eventMgr = Instance.get(EventMgr);
App.timerMgr = Instance.get(TimerMgr);
App.assetMgr = Instance.get(AssetMgr);
App.poolMgr = Instance.get(ObjectPoolMgr);
App.httpMgr = Instance.get(HttpLogicMgr);
App.audioMgr = Instance.get(AudioMgr);
App.userInfo = Instance.get(UserInfo);
App.paintingGridDataMgr = Instance.get(PaintingGridDataMgr);
App.paintingPaletteDataMgr = Instance.get(PaintingPaletteDataMgr);
App.propMgr = Instance.get(PropMgr);
App.saveDataMgr = Instance.get(SaveDataMgr);
App.artDataMgr = Instance.get(ArtDataMgr);
App.gridMgr = Instance.get(GridMgr);
/** ----初始化数据库 */
const dbOk = await App.saveDataMgr.init(UserInfo.PaintingDataKey);// 增加新的数据表需要同时修改版本号
console.log('dbOk = ' + dbOk);
// App.userInfo.clearAllDatas()
/** ----加载数据 */
App.userInfo.loadData();
/** ----初始化ui管理 */
// 注册事件监听
App.eventMgr.registerOwner(UIMgr);
// 初始化ui管理类
App.uiMgr = Instance.get(UIMgr).init(App.UIRoot);
/** ----加载art数据 编辑器生成的 */
await App.artDataMgr.loadData();
await this.cacheViews(['PaintingView']);
/** ----初始化configs */
App.configMgr = Instance.get(ConfigMgr);
await App.configMgr.loadConfig('dataConfigs');
App.configArtGroupMgr = Instance.get(ConfigArtGroupMgr).init(App.configMgr.getTable('artGroup'));
App.configArtMgr = Instance.get(ConfigArtMgr).init(App.configMgr.getTable('art'));
/** ----初始化tile缓存 */
let prefab = await App.assetMgr.load('prefabs/TiledTile', cc.Prefab);
App.poolMgr.createObjectPool('TiledTile', (prefab as cc.Prefab), 110 * 110 * 4);
prefab = await App.assetMgr.loadPrefab('prefabs/StarArrayEffect');
App.poolMgr.createObjectPool('StarArrayEffect', (prefab as cc.Prefab), 110 * 110 * 4);
prefab = await App.assetMgr.loadPrefab('prefabs/StarBlinkEffect');
App.poolMgr.createObjectPool('StarBlinkEffect', (prefab as cc.Prefab), 300);
/** ----进入游戏 */
App.uiMgr.showView('HomeBottomView', 0);
cc.game.setFrameRate(30);
}
private async cacheViews(names: string[]) {
for (let index = 0; index < names.length; index++) {
const name = names[index];
const Prefab = await App.assetMgr.load(`ui/${name}`, cc.Prefab);
App.poolMgr.createObjectPool(name, (Prefab as cc.Prefab), 1);
}
}
update(dt) {
App.timerMgr.update(dt);
}
/**
* 显示绘制界面
* @param data
*/
static async GotoPainting(data: any) {
App.userInfo.paintingRecord(data.id);
App.userInfo.saveData();
await App.uiMgr.showView('PaintingView', data);
App.uiMgr.hideView('HomeBottomView');
App.uiMgr.hideView('CutImageView');
// cc.game.setFrameRate(60);
}
/**
* 回到主界面
*/
static async GotoHome() {
if (!App.uiMgr.isViewShow('HomeBottomView')) {
await App.uiMgr.showView('HomeBottomView');
}
}
}