在知乎上看到 赵雨森同学 提到前端工程化有四个方面,模块化、组件化、规范化、自动化,本人十分赞同,我在工作中也慢慢这几个方向作出了总结
模块化只是在语言层面上,对代码的拆分;而组件化是基于模块化,在设计层面上,对UI(用户界面)的拆分
现在ES6已经在语言层面上规定了模块系统,完全可以取代现有的CommonJS和AMD规范,而且使用起来相当简洁
webpack + babel 将所有模块打包成一个文件加载systemjs 分模块异步加载目前使用了这三方式处理:
使用 vuejs 的scoped style[ ] 采用一命名风格,推荐 BEM采用一css预处理器,目前使用sass组件化是基于模块化的,因为组件的单位可以有模板,样式加逻辑。
另,将你所能看见到的视图(UI)进行合理拆分得到的单元,并能让它达到可复用程度,可称之为组件。组件的方案采用 vuejs 的单文件组件
为了更好的落实开发,可以制定一些规范
采用 restful 风格,接口描述使用swagger
对于某些接口返回状态码还是中文结果,前端应尽量不让去判断状态,只作显示
node module 遵循unix的思想–do one thing and do it well,也因此单个上层的模块会依赖很多下层的模块,这可能会导致其中一个下层的模块改变,导致整个上层模块崩溃。
package.json 里的包版本号应写死,除非因某个包有了新需求特性,再去更新
长命名使用驼峰式。类使用 `ClassName`,而方法名或属性使用 `classProperty`
这里指的是协作工具的采用
任务分配,trello/gitlab todo代码仓库,gitlab文档,gitlab wiki/trello产品设计,sketch画图,inDesign写文档使用docker自动化部署,集群使用 kubernetes(k8s)
目前使用webpack/rollup
图标使用 svg sprite浏览器自动刷新,热加载编译中间语言,如 es6/7,sassjs、css的压缩及混肴压缩图片,一定大小内使用base64根据文件内容生成哈希值,实现缓存控制实现按需加载,见模块化部分umd 打包无论是开源项目还是私有项目都可以使用徽章查看状态
travis/circle,持续集成codacy,代码审查npm,提供版本号,下载量等开源许可,一般采用 mit[ ] codecov,代码覆盖率检测[ ] saucellabs,跨浏览器集成测试基于以上工程化流程,技术选型如下:
基础库 vuenode中间层 koacss预处理 sass日志收集 sentry前端测试框架 jasmine构建工具 webpack/rollup调试工具 chrome/ide/vue-dev-tools后台进程管理 pm2包管理工具 npm/yarn前后端通信 json-rpc/swagger/graphql(查询)css reset 采用 normalize.css
不考虑兼容的情况下,一维用 flexbox,二维用 css grid,单位 rem/vm vw,更改盒模型为 box-sizing减少padding和border的计算;考虑兼容性则使用 bootstrap3 提供的grid布局方案
hover,animate.css,velocity
sass 存在 Duplicate import problem
暂时没去解决,现有以下可以解决办法
Extract FileWebpack loader globalWebpack 去重代码(待证实)cssnano(推荐)结论是尽量不要使用引用, variable或者function之类的可以使用
参考地址 http://ryerh.com/sass/2016/03/15/vue-webpack-duplicate-sass-import.html
webpack会花很多的时间查找一个库的依赖,使用该参数可以在webpack 中忽略对已知文件的解析
例如,这里我们可以确定 vue 是没有依赖项的,配置如下
// 支持正则匹配文件名 module :{ noParse: { 'vue': './node_modules/vue/vue.min.js' } }这样我们在项目中可以使用
import vue from 'vue'为引入模块提供别名,这个可以减少webpack去查找引入模块位置的时间,同时也为我们开发中引入公用模块提供方便
resolve: { alias: { 'ui': path.resolve(__dirname, 'app/compontens/ui'), 'fonts': path.resolve(__dirname, 'app/assets/fonts') } }以上配置可以让我们在需要引用公用组件时不必考虑目录层级的问题
import modal from 'ui/modal.vue'css如果要使用webpack中的alias,需要在alias名前加上 ~
@font-face { url( "~fonts/iconfont.woff") format('woff') }让webpack理解es6 的导入机制,例如现在有两个文件
// utils.js export function foo() { return 'foo'; } export function bar() { return 'bar'; } // app.js import { foo } from './utils'如果不使用 tree-shaking,app.js编译输出为
/***/ function(module, exports) { 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.foo = foo; exports.bar = bar; // utils.js function foo() { return 'foo'; } function bar() { return 'bar'; } /***/ }可以看到上面包含了 foo 和 bar 两个函数,把utils里的内容全部打包进去了,如果使用tree-shaking,输出结果是这样的
/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = foo; /* unused harmony export bar */ // utils.js function foo() { return 'foo'; } function bar() { return 'bar'; } /***/ }),我们可以看到哪些方法是没有被使用的,你可以通过 --optimize-minimize 参数压缩代码剔除未被使用的函数
// 脚本 "scripts": { "build": "webpack --optimize-minimize", "seebuild": "webpack" } // 通过格式工具查看到的结果 function(t, e, n) { "use strict"; function r() { return "foo" } e.a = r }已经没有bar了
在项目下创建一个 .babelrc 的配置文件。目前通过插件babel主要提供了以下几个功能
在vue中异步加载可将 system.import 转为 import()使用 tree shaking使用 es6/7 语法及特性待补充
附上一个后台项目 demo