原文:https://juejin.cn/post/6844903588553048077
适合小项目,不分前后端,页面由JSP、PHP等在服务端生成,浏览器负责展现。
为了降低复杂度,以后端为出发点,有了Web Server层的架构升级,比如Structs、Spring MVC等。
2005年Ajax正式提出,前端开发进入SPA(Single Page Application 单页面应用)时代。
为了降低前端开发复杂度,Backbone、EmberJS、KnockoutJS、AngularJS、React、Vue等大量前端框架涌现。
随着Node.js的兴起,为前端开发带来一种新的开发模式。
业界比较出名的实践是,阿里巴巴的中途岛计划。
统一团队成员的编码规范,便于团队协作和代码维护
开发流程的规范
目标: 职责分离、降低耦合,增强代码的可读性、维护性和测试性。
采用模块化的方式组织代码
采用组件化的编程思想,处理 UI 层
将数据层分离管理
除了备注描述,什么问题都没解决
// file app.js
var helloInLang = {
en: ‘Hello world!‘
};
// file hello.js
/* helloInLang defined in app.js */
function writeHello(lang) {
document.write(helloInLang[lang]);
};复制代码
命名空间模式始于2002年,使用特殊的约定命名,用于避免命名冲突和全局作用域污染。
缺点:大型项目可维护性较差,没有解决模块间依赖管理的问题。
// file app.js
var app = {};
// file greeting.js
app.helloInLang = {
en: ‘Hello world!‘
};
// file hello.js
app.writeHello = function (lang) {
document.write(app.helloInLang[lang]);
};复制代码
封装了变量和function,和全局的namaspace不接触,松耦合
只暴露可用public的方法,其它私有方法全部隐藏
// file app.js
var app = {};
// file greeting.js
app = (function (app) {
var _app = app || {};
_app.helloInLang = {
en: ‘Hello world!‘
};
return _app;
} (app));
// file hello.js
app = (function (app) {
var _app = app || {};
_app.writeHello = function (lang) {
document.write(app.helloInLang[lang]);
};
return _app;
} (app));复制代码
2009年 Angular 引入 Java 世界的依赖注入思想。
核心思想:某个模块不需要手动初始化某个依赖对象,只需要声明该依赖,并由外部框架自动实例化该对象,并传递到模块内。
// file greeting.js
angular.module(‘greeter‘, [])
.value(‘greeting‘, {
helloInLang: {
en: ‘Hello world!‘
},
ayHello: function(lang) {
return this.helloInLang[lang];
}
});
// file app.js
angular.module(‘app‘, [‘greeter‘])
.controller(‘GreetingController‘, [‘$scope‘, ‘greeting‘, function($scope, greeting) {
$scope.phrase = greeting.sayHello(‘en‘);
}]);复制代码
服务器端 javascript 模块化解决方案,适用于同步模块加载。
// file greeting.js
var helloInLang = {
en: ‘Hello world!‘
};
var sayHello = function (lang) {
return helloInLang[lang];
}
module.exports.sayHello = sayHello;
// file hello.js
var sayHello = require(‘./lib/greeting‘).sayHello;
var phrase = sayHello(‘en‘);
console.log(phrase);
浏览器端 javascript 模块化解决方案,适用于异步模块加载。
// file lib/greeting.js
define(function() {
var helloInLang = {
en: ‘Hello world!‘
};
return {
sayHello: function (lang) {
return helloInLang[lang];
}
};
});
// file hello.js
define([‘./lib/greeting‘], function(greeting) {
var phrase = greeting.sayHello(‘en‘);
document.write(phrase);
});复制代码
UMD 允许在环境中同时使用 AMD 与 CommonJS 规范。
(function(define) {
define(function () {
var helloInLang = {
en: ‘Hello world!‘
};
return {
sayHello: function (lang) {
return helloInLang[lang];
}
};
});
}(
typeof module === ‘object‘ && module.exports && typeof define !== ‘function‘ ?
function (factory) { module.exports = factory(); } :
define
));复制代码
ES2015 Modules 作为 JavaScript 官方标准,日渐成为了开发者的主流选择。
// file lib/greeting.js
const helloInLang = {
en: ‘Hello world!‘
};
export const greeting = {
sayHello: function (lang) {
return helloInLang[lang];
}
};
// file hello.js
import { greeting } from "./lib/greeting";
const phrase = greeting.sayHello("en");
document.write(phrase);复制代码
采用tdd的编程思想,引入单元测试
使用各种调试工具
使用前端构建工具
javascript 编译工具
开发辅助工具
使用CI集成工具
使用脚手架工具
原文:https://www.cnblogs.com/panpanwelcome/p/14755035.html