一些回顾和总结
这几天又在回顾一些angularjs、还有一些项目基本目录结构、项目打包相关的东西;
不禁要感叹一句 “吾生也有涯,而知也無涯。以有涯隨無涯,殆已。”
1.回顾过程中,重新发现的点,这个项目的背景就是客户端的框架结构是我用"拿来主义"镜像的,今天才留意到?t=这段,我前面一直以为是webpack或者gulp的版本控制 ,当时看的时候没留意到;
<script src="api/internal/properties/env.jsx"></script>//window.XXX = {"version":xxx}
document.writeln((window.XXX.env === "dev"?[
xxxx
]:[
xxxx
]).map(function (s) {
return '<link href="' + s + '?t=' + window.XXX.version + '" rel="stylesheet" type="text/css"/>'
//return '<script type="application/javascript" src="' + s + '?t=' + window.XXX.version + '"><\/script>'
}).join('\n'));
2. 很容易了解到的是angularjs的前端路由机制,在一个现有的前端项目代码中做一些路由修改增改不难,但是让你在仔细想想你的angularjs项目具体使用的什么路由手段的时候,此时我茫然了
形如:
$stateProvider.state("login", {
'url': "/login",
'views': {
'header': {
'controller': 'headerCtrl',
'templateUrl': 'xxx/header.html'
},
'content': {
'templateUrl': function () {
return 'xxx/login.action';
}
//'controller': 'XXXCtrl',
//template: '<ui-view/>'
}
}
//'controller': 'xxxCtrl',
//'templateUrl': function () {
// return 'xxxx/xxxx.action';
//},
'resolve': {
loadMyCtrl: ['$ocLazyLoad', function ($ocLazyLoad) {
return $ocLazyLoad.load( [
xxx
]);
}]
}
//'abstract': true,
//'cache': false,
似乎和标准的angularjs路由写法并不相同,这属于那种呢?见参考;
参考:
https://stackoverflow.com/questions/22790209/angular-ui-router-ui-views-vs-directives
https://ivanproskuryakov.github.io/publications/AngularJS-routeProvider-and-stateProvider/
3.关于前端的代码项目目录的组织结构
D:.
│ index.html
│ style.css
│
├─api
│ ├─internal
│ │ ├─i18n
│ │ │ 语言包.jsx
│ │ │
│ │ ├─properties
│ │ │ 环境.jsx
│ │ │
│ │ └─sso
│ │ 单点登录
│ │
│ └─private
│ │
│ ├─npi
│ ├─collection
│ │
│ ├─xxx
│ │ └─XXController
│ │
│ └─v1
│ └─xxxx
│
├─common
│ 一些公用的静态资源
│
├─fonts
│ xxx.woff
│
├─images
│ │ 一些静态的图片资源
│
├─js
│ │ 外部的js
│
│
├─node_modules
│
├─npi
│ 一些动态请求的template
│
│
├─pages
│ ├─common
│ │ ├─公用的一些模板和,相当于component
│ │ ├─js其controller
│ │
│ │
│ │ ├─XXX
│ │ │ │ XXXView.html
│ │ │ │
│ │ │ └─js
│ │ │ XXXView.js
│
├─state
│ 打包后的js
│
├─style
│ │ css样式
│
└─upload
文件上传的url
这个路径下混杂这一些后端路径,生产环境和开发环境的路径也是混杂的;
参考:
https://scotch.io/tutorials/angularjs-best-practices-directory-structure
https://stackoverflow.com/questions/18542353/angularjs-folder-structure
https://tutorialedge.net/javascript/angularjs/angularjs-project-structure-tutorial/
http://bguiz.github.io/js-standards/angularjs/application-structure/
https://dzone.com/articles/angularjs-%25E2%2580%2593-recommended
https://github.com/rudolfolah/learning-angularjs/blob/master/project-structures.org
https://thinkster.io/egghead/directive-for-route-handling
https://stackoverflow.com/questions/21414133/angularjs-directive-vs-routeprovider
4.关于angular-ui
参考:
http://angular-ui.github.io/bootstrap/
由于plnkr.co不在公司内网白名单, 居然想不到简单的运行样例代码的方法了,后来发现包裹代码在plucker.js中;
5.关于项目打包
项目打包的重点在于将解决方案有机的融合到自己的当前项目中去,也就意味着框架和开发流还是有不完整和缺失的;
参考:
https://blog.csdn.net/ZWQ0325/article/details/90694099
https://www.webpackjs.com/guides/getting-started/
https://webpack.js.org/plugins/commons-chunk-plugin/
https://stackoverflow.com/questions/30329337/how-to-bundle-vendor-scripts-separately-and-require-them-as-needed-with-webpackhttps://github.com/wooorm/vendors/blob/master/package.json
https://www.toptal.com/javascript/optimize-js-and-css-with-gulp
http://blog.namangoel.com/browserify-vs-webpack-js-drama
https://www.cleveroad.com/blog/gulp-browserify-webpack-grunt
https://blog.csdn.net/dear_mr/article/details/72589256
https://www.npmjs.com/package/bundle-js
6.关于前端测试
规模比较小的团队说实话很难花太多人力和精力投入这部分内容,但是自动接口测试和系统测试其实是版本可靠性的不可缺少的保障;尤其可以避免的情况是,在频繁迭代的项目中,发布前自动测试可以避免出现后面的开发影响前面的功能这类情况;
摘一段:
11. 测试
测试的目的在于能以最少的人力和时间发现潜在的各种错误和缺陷,这在项目更新、重构等的过程中尤其重要,因为每当更改一些代码后,你并不知道这些代码有没有问题、会不会影响其他的模块。如果有了测试,运行一遍测试用例,就知道更改的代码有没有问题、会不会产生影响。
一般前端测试分以下几种:
单元测试:模块单元、函数单元、组件单元等的单元块的测试
集成测试:接口依赖(ajax)、I/O 依赖、环境依赖(localStorage、IndexedDB)等的上下文的集成测试
样式测试:对样式的测试
E2E 测试:端到端测试,也就是在实际生产环境测试整个应用
一般会用到下面的一些工具:
jest
enzyme
cypress
selenium
puppeteer
另外,可以参考 聊聊前端开发的测试。
参考:
https://segmentfault.com/a/1190000017158444
https://github.com/senntyou/blogs
https://github.com/senntyou/blogs/blob/master/web-extend/10.md
7.angularjs的一些常见的小点
angularjs的$compile
.controller('dataAuditCtrl', ['$scope', ..., '$timeout','$compile',..., function ($scope,..., $timeout,$compile,...) {
angular.element(document.getElementById("drop_" + tableId)).append($compile(html)($scope));//编译进去
angularjs的$timeout---适用于你希望下一帧执行的这类场景,我这个描述可能不太准确
$timeout(function() {
});
angularjs $broadcast
参考:
https://stackoverflow.com/questions/37717493/usage-of-broadcast-emit-and-on-in-angularjs/42772444
https://stackoverflow.com/questions/19446755/on-and-broadcast-in-angular
angularjs component的几种bindings
@ > =
angularjs ng-if vs ng-show
angularjs ng-repeat中$index始终不变时看一下是否存在autocomplate等
angularjs中deferred使用
To make it shorter, here's what you should know:
deferred.resolve() - means request succeeded
deferred.reject() - request failed
deferred.resolve(data) - means request succeeded and here's some data
deferred.reject(data) - request failed and here;s some data
angularjs服务的写法
angularjs服务Service
angular.module('xxx.service', []).factory('locals', ['$window', function ($window) {
return {
...//https://stackoverflow.com/questions/37431652/angularjs-localstorage-with-object
}
}]).service('xxxService', ['locals', '$timeout', '$http', '$httpParamSerializerJQLike','$q', function (locals, $timeout, $http, $httpParamSerializerJQLike,$q) {
var xxxService = {
};
return xxxService;
}]).service("SsoService", ['$q', '$injector', '$rootScope', function ($q, $injector, $rootScope) {
return {
login: function (err) {
...
}
}
}]).constant('xxxConstant', {//定义前端使用的常量
XXX:'xxx'
});
angularjs发送json
PostJson: function (url, data, successFun) {
if (url.indexOf(window.xxx.contextPath)===-1){
url = window.xxx.contextPath + url;
}
return $http.post(url, angular.toJson(data), {headers: {'Content-Type': 'application/json'}}).then(function (response) {
if (angular.isFunction(successFun)) {
return successFun(response);
}
})
}
angularjs发送form结构
PostJQlike: function (url, data, successFun) {
if (url.indexOf(window.xxx.contextPath)===-1){
url = window.xxx.contextPath + url;
}
return $http.post(url, $httpParamSerializerJQLike(data), {headers: {'Content-Type': 'application/x-www-form-urlencoded'}}).then(function onSuccess(response) {
if (angular.isFunction(successFun)) {
return successFun(response);
}
})
}
一些暂未分类的参考:
https://github.com/thelgevold/angular-lazy-load
https://github.com/go-gitea/gitea
/*---------------------------------- 分割线-------------------------------------*/
关于前端优化:
https://zhuanlan.zhihu.com/p/52625231
- 点赞
- 收藏
- 关注作者
评论(0)