电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Web應(yīng)用開發(fā)中的幾個(gè)問題——使用javascript開發(fā)需知

瀏覽:32日期:2023-11-24 09:45:08
開篇概述

Ajax技術(shù)在Gmail中的成功應(yīng)用,和高性能的V8引擎的推出,使得編寫Web應(yīng)用變得流行起來,使用前端技術(shù)也可以編寫具有復(fù)雜交互的應(yīng)用。相對于原生應(yīng)用,Web應(yīng)用具有如下優(yōu)點(diǎn):

跨平臺,開發(fā)和維護(hù)成本低;升級和發(fā)布方便,沒有版本的概念,隨時(shí)隨地發(fā)布,用戶沒有感知,不需要安裝;響應(yīng)式設(shè)計(jì)(Responsive Design)使得Web應(yīng)用可以跨平臺,同一份代碼自適應(yīng)各種 屏幕大小即使最終不采用Web應(yīng)用方案,也很適合開發(fā)原型

當(dāng)然,Web應(yīng)用也不是沒有缺點(diǎn)。由于不同平臺和廠商的瀏覽器并不完全一樣,跨平臺也有一些兼容成本。另外,Web應(yīng)用的性能不如native應(yīng)用,交互有時(shí)候不是很流暢, 再加上HTML5的API上的限制,使得有些功能采用Web應(yīng)用不太合適。由于這些原因,結(jié)合兩者優(yōu)點(diǎn)的混合方案變得流行起來(比如微信、手機(jī)QQ和手機(jī)QQ瀏覽器中會嵌入一 些Web頁面)。

根據(jù)筆者的開發(fā)經(jīng)驗(yàn),下面總結(jié)一些Web應(yīng)用開發(fā)過程中的要面臨的幾個(gè)問題。

模塊化編程

模塊化編程是編寫大規(guī)模應(yīng)用必不可少的一個(gè)特性,與其它主流的編程語言相比 Javascript沒有對模塊提供直接的支持,更不用說維護(hù)模塊之間的依賴關(guān)系,這使得維 護(hù)Javascript代碼變得異常困難,在<script>標(biāo)簽中包含代碼的順序需要人工維護(hù)。

要支持模塊化編程必須解決兩個(gè)問題:

支持編寫模塊并為模塊命名,防止名字沖突和全局變量的使用;支持顯示指定模塊之間的依賴關(guān)系,并在程序執(zhí)行時(shí)自動加載依賴的模塊。

Douglas Crockford在”Javascript: The Good Parts”一書中提出的Module Pattern利用Javascript的閉包技術(shù)來模擬模塊的概念,防止名字沖突和全局變量的使用。這解決了第一個(gè)問題。

var moduleName = function () { // Define private variables and functions var private = ... // Return public interface. return {foo: ... };}();

為了解決第二個(gè)問題CommonJS組織定義了AMD規(guī)范方便 開發(fā)者顯示指定模塊之間的依賴關(guān)系,并在需要時(shí)加載依賴的模塊。RequireJS是AMD規(guī)范的一個(gè)比較流行的實(shí)現(xiàn)。

首先我們在a.js中定義模塊A.

define(function () { return {color: 'black',size: 10 };});

然后定義模塊B依賴模塊A.

define(['a'], function (A) { // ...});

當(dāng)模塊B執(zhí)行時(shí)RequireJS保證模塊A已被加載。具體細(xì)節(jié)可參考RequireJS官方文檔。

腳本加載

最簡單的腳本加載方式是放在<head>加載。

<head> <script src='http://www.hdgsjgj.cn/bcjs/base.js' type='text/javascript'></script> <script src='http://www.hdgsjgj.cn/bcjs/app.js' type='text/javascript'></script></head>

其缺點(diǎn)是:

加載和解析是順序是同步執(zhí)行的,先下載base.js然后解析和執(zhí)行,然后再下載app.js;加載腳本時(shí)還會阻塞對<script>之后的DOM元素的渲染。

為了緩解這些問題,現(xiàn)在的普遍做法是將<script>放在<body>的底部。

<script src='http://www.hdgsjgj.cn/bcjs/base.js' type='text/javascript'></script> <script src='http://www.hdgsjgj.cn/bcjs/app.js' type='text/javascript'></script></body>

但并不是所有的腳本都可以放在<body>的底部,比如有些邏輯要在頁面渲染時(shí)執(zhí)行, 不過大多數(shù)腳本沒有這樣的要求。

將腳本放在<body>底部仍然沒有解決順序下載的問題,一些瀏覽器廠商也意識到了 這個(gè)問題并開始支持異步下載。HTML5也提供了標(biāo)準(zhǔn)的解決方案:

<script src='http://www.hdgsjgj.cn/bcjs/base.js' type='text/javascript' async></script><script src='http://www.hdgsjgj.cn/bcjs/app.js' type='text/javascript' async></script>

標(biāo)上async屬性的腳本表明你沒有在里面使用document.write之類的代碼。瀏覽器 將異步下載和執(zhí)行這些腳本,并且不會組織DOM樹的渲染。但是這會導(dǎo)致另一個(gè)問題: 由于是異步執(zhí)行,app.js可能在base.js之前執(zhí)行,如果它們之間有依賴關(guān)系這將導(dǎo)致錯誤。

講到這里從開發(fā)者角度來看我們其實(shí)需要的是這些特性:

異步下載,不要阻塞DOM的渲染;按照模塊的依賴關(guān)系解析和執(zhí)行腳本。

所以腳本的加載其實(shí)需要與模塊化編程問題結(jié)合起來解決。RequireJS不僅記錄了模 塊之間的依賴關(guān)系,并且提供了根據(jù)依賴關(guān)系的按需加載和執(zhí)行(詳情請參考 RequireJS官方文檔)。

關(guān)于腳本加載的更多方案請看這里.

靜態(tài)資源文件的部署

這里的靜態(tài)資源文件是指CSS、Javascript和CSS需要的一些圖片文件。它們的部署需 要考慮兩個(gè)問題:

下載速度版本管理

靜態(tài)資源文件的一個(gè)特點(diǎn)變化不頻繁,且與用戶身份無關(guān)(即與Cookie無關(guān)),因此很適合緩存。另一方面,一旦靜態(tài)資源文件變化時(shí),瀏覽器必須從Web服務(wù)器下載最新 的版本。當(dāng)發(fā)布新版本的Web應(yīng)用時(shí),并不是所有用戶馬上就用上新版本,老版本和新版本將會共存,這就涉及到版本匹配問題。老版本的應(yīng)用需要下載老版本的CSS和 Javascript,新版本的應(yīng)用需要下載新版本的靜態(tài)資源。

為了防止版本不一致,每當(dāng)發(fā)布新版本的應(yīng)用時(shí)靜態(tài)資源文件都需要改名,讓舊的 HTML引用舊的靜態(tài)文件,新的HTML引用新的靜態(tài)文件。一個(gè)常見辦法就是在文件名 中加時(shí)間戳;為了防止懸掛引用,資源文件應(yīng)該比HTML先發(fā)布。

上述方案可以解決版本問題,這樣每個(gè)靜態(tài)文件的緩存時(shí)間可以設(shè)置得任意大,防止重復(fù)下載,同時(shí)在新版本發(fā)布時(shí)瀏覽器將及時(shí)更新。

為解決下載速度問題,可以考慮以下幾個(gè)方案:

合并靜態(tài)文件以免文件數(shù)量過多,過多的文件需要更多的連接來下載,瀏覽器通常 對同一個(gè)域名的連接數(shù)量有限制;壓縮靜態(tài)文件;為了可讀性,CSS和Javascript通常有很多空行、縮進(jìn)和注釋,這 些在發(fā)布時(shí)都可以去掉;靜態(tài)文件通常與Cookie沒有關(guān)系,所以為了減小傳輸大小和增加緩存命中率(緩存的key需要考慮Cookie),靜態(tài)文件最好托管在沒有Cookie的域名上;

最后也是最重要的,要使上述過程自動化。

MVC編程模型

Web應(yīng)用采用的是事件驅(qū)動編程模型,與native應(yīng)用是一樣的,區(qū)別僅在于基礎(chǔ)設(shè)施提供的API不一樣。UI編程通常采用MVC設(shè)計(jì)模式,以流行的Backbone.js為例包括如下部分:

Model數(shù)據(jù)的唯一來源負(fù)責(zé)獲取和存儲數(shù)據(jù)可提供緩存機(jī)制數(shù)據(jù)變化時(shí)通過事件通知其它對象View負(fù)責(zé)渲染監(jiān)聽UI事件和Model事件并重繪UI渲染結(jié)果取決于兩類數(shù)據(jù):Model和UI交互狀態(tài)UI的交互狀態(tài)通常存在View對象中,有時(shí)候?yàn)榱朔奖阋泊嬖贒OM樹節(jié)點(diǎn)中為了降低渲染成本,盡量減少需要渲染的區(qū)域,每次當(dāng)數(shù)據(jù)變化時(shí)只渲染受影響 的區(qū)域Router負(fù)責(zé)監(jiān)聽URL的變化,并通知相應(yīng)的View對象渲染頁面

為了有效地使用MVC,有幾個(gè)問題需要注意。

Model應(yīng)與View完全隔離

Model僅提供數(shù)據(jù)的訪問,不應(yīng)該依賴View,因此Model不應(yīng)該知道View的存在。所以 Model不能持有對任何View對象的引用。Model的數(shù)據(jù)發(fā)生變化時(shí)只能通過事件通知 View.

View在初始化時(shí)采用委派方式監(jiān)聽UI事件

這里有兩個(gè)關(guān)鍵點(diǎn):

在初始化時(shí)監(jiān)聽事件var View = Backbone.View.extend({ initialize: function () { this.$el.on(‘click’, ‘#id’, function () { // … }); } });

除了一些特殊情況外(請看下文),所有UI事件都應(yīng)該在View初始化時(shí)初始化,防止同 一個(gè)事件被綁定多次。即使有些事件是動態(tài)監(jiān)聽的(有時(shí)候需要監(jiān)聽,有時(shí)候有不需要 監(jiān)聽,比如有些按鈕有時(shí)候是有效的,有時(shí)候又無效),也需要在初始化時(shí)監(jiān)聽,然后 在事件回調(diào)函數(shù)里判斷是否需要處理。這樣邏輯更簡單,更容易維護(hù)。

采用委派方式監(jiān)聽UI事件

關(guān)于委派方式監(jiān)聽請參考jQuery文檔.

上面已強(qiáng)調(diào)要在初始化時(shí)監(jiān)聽事件,但是初始化時(shí)需要監(jiān)聽的DOM節(jié)點(diǎn)可能還不存在, 所以沒法直接綁定事件,只能采用委派方式。不過采用委派方式要求事件可以冒泡。

對于那些沒法冒泡的事件(比如<img>的load事件)只能在保證其存在的情況下直 接綁定,而不一定要在初始化時(shí)綁定。

復(fù)雜的View組織成樹形層次結(jié)構(gòu)

函數(shù)太大了需要拆分成幾個(gè)子函數(shù)。同樣,View的邏輯如果過于復(fù)雜也應(yīng)根據(jù)頁面結(jié) 構(gòu)拆成幾個(gè)子View:

父View通過引用訪問子View,但是子View不應(yīng)該持有父View的引用;子View只負(fù)責(zé)自己區(qū)域的渲染,其它區(qū)域由父View負(fù)責(zé)渲染;父View通過函數(shù)調(diào)用訪問子View的功能,子View通過事件與父View通信;子View之間不能直接通信。

其它技巧可查看Backbone技巧與模式.

離線應(yīng)用緩存

為使Web應(yīng)用體驗(yàn)更加流暢,可考慮使用HTML5離線應(yīng)用緩存,不過有以下幾點(diǎn)需要注 意:

不要將離線應(yīng)用緩存與HTTP緩存機(jī)制搞混淆,前者是HTML5引入的新特性,與HTTP緩 存機(jī)制是相互獨(dú)立并存的;Cache manifest文件不應(yīng)被HTTP緩存太久(通過HTTP頭Cache-Control控制緩存 時(shí)間),否則發(fā)布新版后瀏覽器不會及時(shí)監(jiān)測到變化并下載新文件;在Cache manifest文件的NETWORK節(jié)放一個(gè)*,否則沒有列在這個(gè)文件的資源不 會被請求;不適合緩存的請求最好都放在NETWORK節(jié);如果之前使用過離線應(yīng)用緩存現(xiàn)在不想再使用了,從<html>刪除manifest屬性, 并發(fā)送404響應(yīng)給manifest文件請求。僅僅刪除manifest屬性是沒有效的。線上錯誤報(bào)告

Javascript是一個(gè)動態(tài)語言,許多檢查都是在運(yùn)行時(shí)執(zhí)行的,所以大多數(shù)錯誤只有執(zhí)行到的時(shí)候才能檢查到,只能在發(fā)布前通過大量測試來發(fā)現(xiàn)。即使這樣仍可能有少數(shù) 沒有執(zhí)行到的路徑有錯誤,這只能通過線上錯誤報(bào)告來發(fā)現(xiàn)了。

window.onerror = function (errorMsg, fileLoc, linenumber) { var s = ’url: ’ + document.URL + ’nfile: ’ + fileLoc + ’nline number: ’ + linenumber + ’nmessage: ’ + errorMsg; Log.error(s); // 發(fā)給服務(wù)器統(tǒng)計(jì)監(jiān)控 console.log(s);};

通常線上的Javascript都是經(jīng)過了合并和壓縮的,上報(bào)的文件名和行號基本上沒法對 應(yīng)到源代碼,對查錯幫助不是很大。不過最新版的Chrome支持在onerror的回調(diào)函數(shù) 中獲取出錯時(shí)的棧軌跡:window.event.error.stack.

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 盐水蒸发器,水洗盐设备,冷凝结晶切片机,转鼓切片机,絮凝剂加药系统-无锡瑞司恩机械有限公司 | 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 穿线管|波纹穿线管|包塑金属软管|蛇皮管?闵彬专注弱电工程? | 通风气楼_通风天窗_屋顶风机-山东美创通风设备有限公司 | 微量水分测定仪_厂家_卡尔费休微量水分测定仪-淄博库仑 | 车载加油机品牌_ 柴油加油机厂家 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 中式装修设计_室内中式装修_【云臻轩】中式设计机构 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 防爆正压柜厂家_防爆配电箱_防爆控制箱_防爆空调_-盛通防爆 | 环氧树脂地坪漆_济宁市新天地漆业有限公司 | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | 翅片管散热器价格_钢制暖气片报价_钢制板式散热器厂家「河北冀春暖气片有限公司」 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 分类168信息网 - 分类信息网 免费发布与查询 | 云南标线|昆明划线|道路标线|交通标线-就选云南云路施工公司-云南云路科技有限公司 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 广西绿桂涂料--承接隔热涂料、隔音涂料、真石漆、多彩仿石漆等涂料工程双包施工 | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 抓斗式清污机|螺杆式|卷扬式启闭机|底轴驱动钢坝|污水处理闸门-方源水利机械 | 电动百叶窗,开窗器,电动遮阳百叶,电动开窗机生产厂家-徐州鑫友工控科技发展有限公司 | 脉冲除尘器,除尘器厂家-淄博机械 | 泰国试管婴儿_泰国第三代试管婴儿_泰国试管婴儿费用/多少钱_孕泰来 | 纯化水设备-纯水设备-超纯水设备-[大鹏水处理]纯水设备一站式服务商-东莞市大鹏水处理科技有限公司 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 济南画室培训-美术高考培训-山东艺霖艺术培训画室 | 长沙网站建设制作「网站优化推广」-网页设计公司-速马科技官网 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | b2b网站大全,b2b网站排名,找b2b网站就上地球网 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 威客电竞(vk·game)·电子竞技赛事官网| 模具ERP_模具管理系统_模具mes_模具进度管理_东莞市精纬软件有限公司 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 餐饮加盟网_特色餐饮连锁加盟店-餐饮加盟官网 | 软启动器-上海能曼电气有限公司 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 活性氧化铝|无烟煤滤料|活性氧化铝厂家|锰砂滤料厂家-河南新泰净水材料有限公司 | 上海租车公司_上海包车_奔驰租赁_上海商务租车_上海谐焕租车 |