Javascript'te% 100 kullanıcı arayüzü yapmak ve bir API aracılığıyla veri sağlamak iyi bir fikir mi?


19

İlk günüm HTML uygulamaları yapmak. Bununla birlikte, birçok düzenlenebilir ızgara görünümü, metin kutusu, açılır menü vb. İçeren CRUD tipi uygulamaları dahili olarak kullandım. Şu anda işi yapan ASP.NET web formlarını kullanıyoruz, ancak performans çoğunlukla kasvetli ve oldukça sık İhtiyacınız olanı almak için çemberlerden atlamak zorundasınız. Tavandan asılan ve alev alan çemberler.

Bu yüzden, tüm kullanıcı arayüzünü JavaScript tarafına taşımanın iyi bir fikir olup olmayacağını merak ediyorum. Özellikle ihtiyaçlarımıza göre uyarlanmış güçlü bir yeniden kullanılabilir kontrol seti geliştirin ve yalnızca sunucu ile veri alışverişi yapın. Evet, "kontrol" (aka "widget") paradigmasını seviyorum, bu tür uygulamalar için oldukça uygun. Yani sunucu tarafında hala mevcut ASPX işaretlememize temel bir düzenimiz olacaktı, ancak bu daha sonra istemciye yalnızca bir kez gönderilecekti ve Javascript kısmı sonraki tüm UI güncellemelerini halledecekti.

Sorun şu ki, bunu daha önce hiç yapmadım ve hiç kimsenin de bunu yaptığını görmedim, bu yüzden problemlerin ne olacağını bilmiyorum. Özellikle, endişeliyim:

  • Hala performans . Karşılaştırma, tarayıcı bir AJAX güncellemesinden sonra sayfanın çoğunu yeniden oluşturmaya çalıştığında şu anda ana gecikmenin istemci tarafında olduğunu gösterir. ASP.NET web formları oluşturulan işaretleme "web" kelimesine yeni bir anlam kazandırır ve zengin Devexpress denetimleri bunun üzerine kendi Javascript karmaşıklığı katmanını ekler. Ancak, Javascript tarafında gerekli tüm değişiklikleri yeniden hesaplamak ve sadece güncellenmesi gerekenleri güncellemek daha hızlı olur mu? Birkaç düzenlenebilir ızgara görünümü, çok sayıda metin kutusu, her birinde yarım milyonlarca filtrelenebilir öğe bulunan birçok açılır menü içeren formlardan bahsettiğimi unutmayın.
  • Geliştirme kolaylığı . Şimdi çok daha fazla Javascript olurdu ve muhtemelen sayfanın HTML işaretlemesi ile karışacaktı. Bu ya da bir tür yeni görüntü motorunun üretilmesi gerekecekti. Javascript için Intellisense de C # kodundan çok daha kötüdür ve Javascript'in dinamik yapısı nedeniyle çok daha iyi olması beklenemez. Kodlama uygulamaları onu biraz geliştirebilir, ancak çok fazla değil. Ayrıca, geliştiricilerimizin çoğu öncelikle C # geliştiricileri olduğundan, bazı öğrenme eğrileri ve ilk hatalar olacaktır.
  • Güvenlik . Bir çok güvenlik kontrolünün iki kez (sunucu tarafı ve UI tarafı) yapılması ve veri işleme sunucusu tarafının bunlardan çok daha fazlasını içermesi gerekecektir. Şu anda, bir metin kutusunu sunucu tarafında salt okunur olarak ayarladıysanız, istemci gidiş dönüşünde değişmeyen değerine güvenebilirsiniz. Çerçeve zaten bunu sağlamak için yeterli koda sahiptir (viewtate şifreleme yoluyla). Yalnızca veri yaklaşımı ile daha da zorlaşır, çünkü her şeyi manuel olarak kontrol etmeniz gerekir. Öte yandan, sadece güvenlik açıklarının fark edilmesi daha kolay olacaktır, çünkü sadece endişelenecek verileriniz olacaktır.

Sonuçta, bu sorunlarımızı çözecek mi yoksa daha da kötüleştirecek mi? Hiç kimse bunu denedi ve sonuçları ne oldu? Bu tür çabalara yardımcı olan herhangi bir çerçeve var mı (jQuery ve ahlaki eşdeğerler bir yana)?


So on the server side we would still have a basic layout simliar to our current ASPX markup, but that then would get sent to the client only once, and the Javascript part would take care of all the subsequent UI updates.ASP.NET'in tam olarak ne olduğunu açıklıyorsunuz , bu da doğru bir şekilde kullanmadığınızı söylüyor. :) ASP.NET uygulamalarınızda bileşenleri güncelleştirme panellerine yerleştirirseniz, ASP.NET javascript kitaplığı sunucu tarafına eşzamansız geri gönderme gerçekleştirir ve yalnızca belirttiğiniz bileşenleri yeniden oluşturur.
maple_shaft

@maple_shaft - Biliyorum, ama bir şekilde bu cehennem gibi yavaş çalışıyor. Ayrıca, ızgaralar zaten geri arama yapar. Diğer her şey için, bir geri gönderme varsa, vakaların büyük çoğunluğunda yine de sayfanın çoğunu yenilemeniz gerekir, çünkü kontroller görünürlüğü / yazılabilirliği / vb. Ve bu yavaş.
Vilx-

3
Birisinin güncelleme panelindeki her şeyi sayfaya koyduğu bir ASP.NET uygulaması her gördüğümde, monitörümü duvara atmak gibi hissediyorum>. <! Bu ASP.NET'in hemen hemen tüm amacını yener. Sunucu tarafı yaşam döngüsünü ve uygulama olaylarını korumak için, sayfanın tüm ViewState'i ile ileri geri iletişim kurması gerekir. 200 kontrolünüz ve bir veri ağınız varsa, büyük performans sorunlarınız olacağını tahmin etmek Joel Spolsky'yi almaz. Ed Woodcock ve AmmoQ her şeyi mükemmel bir şekilde özetlediler, bu yüzden size ek bir cevap vermeye gerek yok.
maple_shaft

1
@maple_shaft - Üzgünüm, ama aslında bu tür şeyler profilli. Yerel geliştirici bilgisayarlarda da yavaştı ve yavaşladı ve Fiddler, HTTP bağlantısının bir saniyeden daha kısa bir süre boyunca açıldığını açıkça gösterdi; sayfa sadece birkaç saniye sonra göründü ve tarayıcı tüm süre boyunca mümkün olduğunca çok CPU kullanıyor olsun ve temelde dondurulmuş. Bu şişirilmiş Viewstate değil, bu şişirilmiş HTML / Javascript.
Vilx-

1
@ Vilx- C # /. NET (Windows dışında / maliyet dışında) yanlış bir şey yok. ASP.NET WebForms çerçevelerinin üzerine koyduğu şişkinlik ile ilgili büyük sorunlar var. Belirtildiği gibi. NET gibi Nancy deneyin. Ama bu tamamen konu dışı, sadece
web formlarını

Yanıtlar:


10

Linkedin bunu mobil siteleri için yapıyor (bkz. Http://engineering.linkedin.com/nodejs/blazing-fast-nodejs-10-performance-tips-linkedin-mobile bölüm 4) ve görünüşe göre onlar için çok yararlı oldu. performans açısından.

Ancak, çeşitli nedenlerle aynı şeyi yapmaktan kaçınmanızı öneririm.

Birincisi, sürdürülebilirliktir: C # / ASP.net, sunucu tarafı, istemci bağımsız olması nedeniyle Javascript değildir (jQuery gibi bir çerçevede bile% 100 çapraz tarayıcı uyumluluğu elde edemezsiniz) , geleceğe hazır değil). Statik olarak yazılmış bir uygulamanın işlevselliğini doğrulamaktan dinamik bir uygulamadan daha kolay olduğunu söyleyebilirim, bu da büyük ölçekli siteler oluşturuyorsanız kesinlikle düşünmeniz gereken bir şeydir.

İkincisi, tüm web sitenizi çalıştırmak için gerekli olan karmaşıklığın türünü (bulmanın göreli kolaylığına kıyasla) saf bir javascript uygulaması oluşturma yeteneğine sahip (ve istekli) diğer kişileri bulmakta zorlanacaksınız. NET programcıları). Bu doğrudan bir endişeniz olmayabilir, ancak kesinlikle uzun vadeli bir bakış açısıyla düşünülmesi gereken bir şeydir.

Üçüncü sorun istemci uyumluluğudır; halka açık web siteleri oluşturuyorsanız, netin makul bir bölümünün hala JS etkin olmadığını unutmayın (çeşitli nedenlerle), bu nedenle büyük bir bölümü hariç tutmayacağınızdan kesinlikle emin olmanız gerekir. JS tabanlı bir web sitesine geçerek kullanıcı tabanınızın

Madde işaretli endişelerinize gelince:

  • Güvenlik yönü hakkında çok fazla endişe etmem, paradigmaları karıştırmamanız ve güvenliğe ihtiyaç duyduğunuzda bazı sunucu tarafı işlemleri yapamamanızın bir nedeni yok (HTML döndüren bir yerde bazı görüntüleme oluşturma koduna sahip olacaksınız , bunun yerine gerektiğinde bunun yerine bir AJAX çağrısını tetiklememesinin bir nedeni yoktur).

  • Geliştirme kolaylığı da gerçekten bir endişe değil, bence JS gelişimi için çok iyi araçlar var, sadece VisualStudio'ya kendinizi koymayın, çünkü alıştınız! (örneğin JetBrains WebStorm'u deneyin).

  • JS view motorlarının performansı çoğu durumda kesinlikle iyidir (yine, benim deneyimime göre), bunları günlük olarak yoğun bir şekilde kullanıyorum. Ne öneririm knockout.js gibi daha ağır çerçevelerden kaçınmak ve bunun yerine Jon Resig'in mikro şablon motoru gibi bir şeye yönelmek. Bu şekilde, destek kodunu hızlı ve güvenilir olduğundan emin olarak takabilirsiniz.

Eğer ben olsaydım, yapacağım şey gerçekten bu değişimin arkasındaki nedenleri incelemek. .NET'i etkili bir şekilde kullanmıyor olabilirsiniz ve oyununuzu yükseltmeniz gerekiyor olabilir, WebForms kutudan çıkar çıkmaz özellikle yavaş bir çerçeve değildir, bu nedenle belki de kullandığınız 3. taraf kitaplıklardan bazıları render işleminizi yavaşlatıyor.

Bir yük testi ve profil oluşturma aracı kullanarak uygulamanın performans profilini yapmayı deneyin ve daha radikal bir çözüme çok fazla zaman ve çaba harcamadan önce darboğazlarınızın nerede olduğunu görün, muhtemelen yavaşlığınız için suçlu!


Hayır, zaten Darknights'ın cevabına yorum yaptığım gibi, bu, halka dönük bir kısmı olmayan (iyi, küçük) dahili bir uygulama, bu nedenle JavaScript bağımlılığı tamam. Ve profilleme yaptım. Sunucu tarafı iyidir. Ağır oluşturulmuş HTML (dediğim gibi, ASP.NET'in oluşturduğu işaretleme kasvetli) ve Devexpress Javascript altında bataklık istemci tarafıdır.
Vilx-

1
@EdWoodcock ASP.NET web siteleri doğası gereği Javascript ile çalışmaktadır. ViewState ve sayfa öğesi oluşturmanın eşzamansız iletişimini bu şekilde işler.
maple_shaft

@ Vilx- Bu bir şok olarak gelebilir, ancak Veri Izgaraları gibi kontroller son derece karmaşıktır. Belki de tek bir sayfada çok fazla eleman var mı?
maple_shaft

@ Vilx- Belki de kontrol kullanımınıza bakmanın zamanı geldi, eğer çılgın işaretleme oluşturuyorlarsa (varsayılan asp.net kontrolleri çoğu durumda DataGrids yerine Repeaters gibi şeyler kullanıyorsanız yok) kendi denetimlerinizi döndürmelisiniz (veya bunun yerine UserControls'te elle yazılmış HTML'ye geçmelisiniz).
Ed James

1
@maple_shaft - Veya, daha spesifik olarak (anladığım kadarıyla) tam olarak bu amaçlar için Flash'ın üzerine inşa edilmiş Flex. Bir süredir oynadığım başka bir fikir. Ama ... bunu başkalarına bahsetmeye çalıştığım kadarıyla, sadece olumsuz yanıt aldım, bu yüzden bunu çekmeyi hayal edemiyorum. Ayrıca hepimizin tamamen yeni bir şey öğrenmesini gerektirecektir.
Vilx-

8

Bu şekilde gitmek istiyorsanız ExtJS kullanın , tekerleği yeniden icat etmeyin. Ancak hazırlıklı olun, bu tam bir paradigma değişikliği anlamına gelir. HTML becerileriniz neredeyse kullanılmıyor. AJAX her yerde, sunucu çoğunlukla bir AJAX API sağlar. Her zamankinden daha fazla javascript yazacaksınız, bu yüzden javascript'e gerçekten uyduğunuzdan emin olun.


1
Javascript ile çok rahatım. Başkalarının da olmadığını biliyorum.
Vilx-

2
Bunu birkaç yıl önceki bir işte yaptım. ExtJS çok güzel ve onunla büyük miktarda yapabilirsiniz.
Zachary K

@ZacharyK - Gerçekten karmaşık formlarda nasıl çalışır? Orada yazdığım gibi olanlar, birkaç gridview, tabpanel vb.
Vilx-

2
Oldukça iyi. elbette veri modellerinizi düşünmeniz gerekir. Dürüst olmak gerekirse, büyük formlardan kaçınmaya çalışıyorum ve birkaç küçük unsur oluşturuyorum. Ama bu ExtJS'nin sınırları ile daha az iyi bir tasarım vb. İle ilgilidir
Zachary K

@ZacharyK - Kendimi tekrar etmek için çok tembel. Ed Woodcock'un cevabı hakkındaki yorumumu okuyun. Daha basit yapamam. :(
Vilx-

8

Bulunduğum ekip 2008'in sonlarında ExtJS'ye geçmeye karar verdi. Bu noktada ön uç sorunlarından muzdarip 200.000 satırlık bir PHP uygulamamız vardı. Durumumuz sizinkinden çok daha kötüydü, çünkü gerçekten kötü olan elle tutulmuş bir form kontrolleri çerçevemiz vardı ve sayfanın bölümlerini yüklemek için iframe'leri yoğun bir şekilde kullandık (görsel mimari 2005 yılına dayanıyordu ve ekip farkında değildi ajax bu erken). Yine de kodu yeniden düzenlemek zorunda kaldık, bu da kod tabanını öncelikli olarak istemci tarafı olacak şekilde yeniden aramaya karar vermeyi kolaylaştırdı.

Bugün uygulama 300.000 satır, hangi 60.000 satır extjs kodu ve kabaca 3/4 işlevselliği ExtJS taşınmıştır. Extjs kodu tamamen tek sayfalık bir uygulamadır, ancak yine de bazı eski formları iframe'lerin içine gömer. Önce navigasyon konteynerini ele geçirdik ve sonra parça parça farklı özellik alanlarını taşıdık. Bu yaklaşımla, dış kaynak geçişini, bizi çok yavaşlatmadan, düzenli özellik geliştirme sürecine aktarmayı başardık.

  • Verim

    ExtJS kodu eski koddan çok daha hızlı oldu. Eski kod elbette performans açısından gerçekten kötüydü, ama yine de sonuçlardan memnunuz. UI kodu tamamen statik javascripttir, bu yüzden gerçekten iyi önbelleğe alır (bir CDN'ye atma planlaması aşamasındayız). Sunucu, buradaki iş yükünü azaltan ön uç oluşturma işlemine dahil değildir. Ayrıca ExtJS'nin UI'nin yaşam döngüsü üzerinde çok fazla kontrol sağlamasına yardımcı olur (tembel oluşturma, görünmez UI öğelerinin kolayca boşaltılması). Tipik olarak, kod önyüklendiğinde (isteğe bağlı yükleme mimarisi) bir ekranın yükleme süresinin çoğu, verileri almak için web hizmeti çağrısında harcanır. ExtJS ızgarası, özellikle kaydırma sırasında görünür satırları oluşturmak için arabelleğe alınmış görünümleri kullanırken gerçekten hızlıdır.

  • Geliştirme kolaylığı

    Dürüst olmak gerekirse, bu karışık bir çanta. ExtJS bir DSL, geleneksel anlamda web geliştirme değil. Geliştiricilerimizin çerçevenin API'sini gerçekten öğrenmesi uzun zaman aldı ve bu eğrinin diğer istemci tarafı çerçevelerinde daha az dik olduğunu görmüyorum. Takımdaki herkes "kıdemli" bir javascript geliştiricisi olmalıdır (genel bir kural olarak, crockford'un kitabının sırları olmamalıdır). Yeni geliştiricilerle önyükleme sorunları yaşıyoruz, çünkü müşteri tarafı uzmanlığı düşündüğünüz kadar yaygın değil ve extjs uzmanlığı neredeyse sıfır (bulunduğumuz Belçika'da).

    Öte yandan, bir kez hızlandığınızda, dev deneyimi çok güzel. ExtJS çok güçlüdür, bu nedenle olukdaysanız inanılmaz ekranları çok hızlı bir şekilde kırbaçlayabilirsiniz. IDE-bilge olarak, ExtJS kodu ile yeteri kadar yetkin bulduğum PHPStorm'u kullanıyoruz.

  • Güvenlik

    Güvenlik, istemci tarafı kullanıcı arayüzü yapmanın ana nedenlerinden biridir. Nedeni basit: saldırı yüzeyinin azaltılması. ExtJS kodumuz tarafından kullanılan web hizmeti API'leri, sunucu tarafı UI katmanından çok daha küçük bir saldırı yüzeyidir. OWASP'nin ASVS'sini kullanmadan önce sunucudaki tüm girdileri doğruluk için doğrulamanız gerektiğini belirtir. Bir web hizmetleri mimarisinde, girdi doğrulamanın ne zaman ve nasıl yapılacağı açık ve kolaydır. Ayrıca, istemci tarafı UI mimarisinde güvenlik hakkında mantık yürütmeyi daha kolay buluyorum. XSS sorunlarıyla hala mücadele ediyoruz, çünkü HTML'ye kodlamaktan mutsuz değilsiniz, ancak genel olarak güvenlik konusunda eski kod tabanından daha iyiyiz. ExtJS, form alanlarının sunucu tarafı doğrulamasını kolaylaştırır, bu nedenle iki kez kod yazmak zorunda kalmazız.


Keşke gerçek deneyiminizden dolayı +1'den fazlasını yapabilseydim!
Vilx-

4

Komut dosyası olmayan kullanıcıları desteklemeyi göze alamazsanız ve arama motorları sizi ilgilendirmiyorsa, evet, mükemmel bir şekilde uygulanabilir bir yaklaşımdır. İşte artıları ve eksileri kısa bir özet:

Artıları:

  • her şey tek bir yerde (javascript)
  • biçimlendirme yerine sunucudan veri yükleyebilirsiniz, bu doğru yapılırsa çok fazla bant genişliği tasarrufu sağlayabilir
  • duyarlı bir uygulama almak daha kolay (ağ gecikmesi hala orada, ancak bir kullanıcının girdisine ilk yanıt daha hızlı geliyor)
  • web sunucusunun herhangi bir HTML oluşturması veya herhangi bir şablonu genişletmesi gerekmez (yani, işleme çabası sunucudan istemciye taşınır)

Eksileri:

  • her şeyin javascript içinde olması gerekir (sorun olabilir veya olmayabilir)
  • kritik mantık sunucuda çoğaltılmalıdır
  • durumun istemci ve sunucuda korunması ve her ikisi arasında senkronize edilmesi gerekir
  • güvenliği doğru yapmak daha zor olabilir (istemci tarafı kodundaki herhangi bir şeyin kötü niyetli kullanıcılar tarafından nasıl değiştirilebileceğini göz önünde bulundurarak)
  • kod tabanınızın büyük bir bölümünü açığa çıkarırsınız (sunucuda çalışan kod dışarıdan görülemez)

Şahsen, bu rotaya giderseniz, ASP.NET UpdatePanels'ın doğru yol olmadığını düşünüyorum. Mevcut web uygulamalarını kısmen özendirmek için harikalar, ancak yine de AJAX üzerinden HTML gönderiyorlar ve bu şekilde yönetme durumu oldukça kıllı olabilir. Sadece statik bir HTML belgesi sunarak, HTML oluşturmayı yapmak için bir javascript şablon kitaplığı kullanın; sunucu hiç dinamik HTML sunmaz, bunun yerine istemci sunucuya iş mantığı düzeyinde çağrılar yapar ve ham veri alır.


1

Evet yapabilirsin ama ..

Uygulamanızın kritik bölümlerinin Javascript olmadan da çalışabilmesi için zarif bir "bozulmaya" sahip olduğunuzdan emin olmanız gerekir.

Çoğu uygulama "HIJAX" tarzı bu şekilde inşa ediyorum.


Uygulamalar zaten javascript ağırdır ve onsuz çalışmaz. Müşterilerimiz bu konuda gayet iyi ve hiç şikayet etmediler. Ve dürüst olmak gerekirse, bu gün ve yaşta Javascript'i devre dışı bırakmış bir kullanıcı bulamadım. Ayrıca, bu uygulamaların herhangi bir SEO'ya (bir arama motoru tüm bu hassas bilgilere erişebiliyorsa bir felaket olurdu) gerekmediğini ve mobil cihazlardan kullanılmak üzere tasarlanmadığını unutmayın. Ayrıca mobil cihazlar için benzer bir şey yapmayı düşünüyoruz, ancak şimdilik sadece konsept aşamalarında ve bir talep olup olmadığını bile bilmiyoruz.
Vilx-

2
"Ve dürüst olmak gerekirse, bu gün ve yaşta Javascript'i devre dışı bırakmış bir kullanıcı bulamadım." Merhaba o zaman. Yeni bir web sitesine açılış yaparken benim için varsayılan javascript devre dışı bırakmak için yüklü noscript var. Ve hiçbir şey işe yaramazsa genellikle web sitesinin sekmesini kapatırım.
Arkh

3
@Arkh bir kullanıcı değil, bir programcı gibi düşünüyorsunuz, şeylerin büyük düzeninde küçük bir azınlığı açıklıyoruz. Bunu bir "js'ye ya da js'ye değil mi?" çünkü bu parçalar etrafında ölümüne yapıldı :)
Darknight

1
JS'yi devre dışı bırakan insanlar genellikle bunu yaparken, buna güvenen ve dolayısıyla çalışmayan sitelerle karşılaşabileceklerinin farkındadırlar. Belirli bir site için etkinleştirmek isteyip istemedikleri seçimdir, ancak standart bir teknolojiyi bilerek devre dışı bırakırlarsa, bir siteye göz atamadıklarını umursamıyorum. Öte yandan, ekran okuyucular için JS desteği hakkında bilmiyorum. Bu daha büyük bir sorun olabilir. Ve elbette indeksleme problemi var. Ancak, endeksleme gerektirmeyen ve zaten kör insanlar tarafından kullanılamayacak bir uygulama yapmak istediğinde, JS'ye güvenmek mantıklıdır.
Andrea

1
maple_shaft Senden hoşlanıyorum, bu yüzden güzelce söyleyeceğim, bu yolda koşmayalım :) teşekkürler!
Darknight

1

Sitem hala bebeklik döneminde ama% 100 js ui benim için şimdiye kadar iyi oldu. Ön uçta var olan tek sunucu mantığı model eşlemeleri ve ajax url'leri. Sunucunun bana göre bakımı çok kolay olan kullanıcı arayüzü hakkında hiçbir bilgisi yok. Eğer ilgileniyorsanız ExtJS http://coffeedig.com/coffee/ yazılmış sitemi kontrol edebilirsiniz . Sitemde herhangi bir güvenlik sorunu yok, ancak istemci normal kullanıcıya basit doğrulama ile yardımcı oluyor. Kötü niyetli bir kullanıcının gerçekten sunucuya herhangi bir ajax gönderebileceğini biliyorum, böylece tüm "güvenlik" mantığı sunucuda yapılır.

Sanırım sizin için en büyük sorun, ekibinizin alışkın olduğu şeyleri tamamen tersine çevirmek olacaksınız, dik bir öğrenme eğrisi olacak. En iyi yaklaşımın bazı js çerçeveleri ile denemek ve bazı basit ekranlar yazarak bunu hissetmeye çalışmak olacağını düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.