월별 아카이브: 1 월 2014

불 쌍 한 남자의 자바 스크립트 캐싱

[TL;박사 버전: 쿠키를 사용 하 여 비동기 호출의 결과 저장; 즉시 과거 비동기 호출의 결과 렌더링 하 고 페이지 로드 후 확인.]

내가 일하고 SharePoint 인트라넷 사이트에 있는 클라이언트에 대 한 기능, 다른 것 들 중, 양식에 일치 시키는 보조 탐색 해당 메뉴 옵션이 일반 오래 된 사용자 지정 목록을 통해 관리 됩니다.  아이디어는 클라이언트에 영향을 미치는 또는 그것에 의해 밖으로 넣어 전역 탐색에 의해 영향을 받지 않고 "그들 의" 사이트의 메뉴 제어를 가져옵니다..

(뭔가 엄청나게을 로드 일부 CSS와 JS... 사이트의 동작에 대 한 거의 모든 것을 근본적으로 변경 하지만 그건 다른 게시물에 대 한 HTML 파일을 가리키는 CEWP 추가 대 한 파괴)

이 아주 간단한 코드:

아픈 자리 여기는 누구 든 지 사이트의 페이지 중 하나를 조회 수 모든 시간, 해당 사용자의 웹 브라우저 목록에서 항목을 가져올 밖으로 도달 합니다.  개발 완료 되 고 테스트 되 면 안정적이 고 완전 한 것을 입증 했다, 이 호출이 필요 하지 않습니다 더 이상 99% 거의 메뉴부터 시간 변경합니다.  그것도 이상한 UI에 영향을 미칠 하이퍼 ajaxy 웹 사이트의이 용감한 새로운 세계에 있는 일반적인-페이지 렌더링 하 고 그런 다음 메뉴 렌더링지 않습니다.  그것은 과민 하 고 내 보기에 산만 한입니다.  그리고 신경 과민. 그래서, 캐싱. 

Thusly 논리를 수정:

  • 마지막 그것을 읽고 메뉴를 포함 하는 브라우저에서 쿠키에 대 한 보고
    • 만약 발견, 즉시 렌더링 합니다.  페이지 로딩 완료를 기다리지 않는다.  (당신의 HTML 여기 전략적으로 배치 되도록 해야, 그것은 일을 열심히 하지만).
  • 로딩을 끝내 고 나머지 또는 lists.asmx 또는 무엇이 든을 사용 하 여 목록에서 메뉴 항목을 로드 하려면 호출 하는 비동기 페이지에 대 한 대기
  • 내가 쿠키에 대 한 비교
    • 일치 하는 경우, 중지
    • 그렇지 않으면, jQuery를 사용 하 여, 경우 동적으로 무리를 채울 <리>에 <ul>
  • CSS를 사용 하 여 모든 서식 할 수
  • 이익!

당신의 일부는 말 거 야, "이 봐! 아니 진짜 캐싱가 여기에 있기 때문에 어쨌든 메뉴를 읽고 있다 매 시간.”  그리고 당신 말이 맞아-하지 휴식의 어떤 서버를 주는 거 야.  하지만 HTML 페이로드 완전히 렌더링 호출은 비동기 이며 이후 페이지의 초기 발생 하기 때문에, 그것은 "느낌"는 사용자에 게 응답성.  메뉴는 페이지 그리는 만큼 꽤 렌더링 합니다.  메뉴 변화를 발생 하는 경우, 사용자 메뉴의 과민 다시 그릴을 복종 된다, 하지만 그 한 번만.

이 캐싱 보다 효과적으로 만들기 하는 동시에 서버 도와 몇 가지:

  • "쿠키 캐시"는 최소 유효 규칙에 24 시간 또는 다른 시간대. 만큼 만료 된 쿠키가, 쿠키의 메뉴 스냅숏을 사용 하 고 결코 서버.

그 게 지금 당장 마음에와 서 다 음... :). 

누구 든 지 여기 어떤 영리한 아이디어를 가진다면 그들을 알고 싶어요.

그리고 마지막으로-이 기술은 다른 것 들에 대 한 사용할 수 있습니다.  이 클라이언트의이 페이지는 다양 한 페이지에 다양 한 데이터 기반 것 들, 그들 중 많은 사람들이 상대적으로 거의 변화 (일주일에 한 번 또는 한 달에 한 번).  기능의 특정 영역을 대상 하는 경우, 로컬 쿠키 저장소에서 콘텐츠를 당기 및 즉시 렌더링 응답성 UI를 제공할 수 있습니다.  그것은 어떤 주기 서버 저장 하지 하는 경우에 사용자에 게 더 빨리 느낀다.  당신은 수 있습니다. 이 로컬 쿠키 캐시를 무효화할 일부 조건과 트리거에 결정 하 여 서버 사이클을 저장 합니다.  그건 모든 상황이 복잡 한 물건 및 진짜로 가장 재미 있는 :). 

</끝>

undefined내 블로그를 구독.

에 지 저 귐에 나를 따르라합니다 http://www.twitter.com/pagalvin

HOWTO: 사무실에 대 한 QUnit.js 및 Blanket.js 단위 테스트 및 테스트 범위 구성 365 SharePoint 응용 프로그램

소개

단위 테스트 탐험 했습니다 하 고 SharePoint 온라인 사무실에 대 한 새로운 SharePoint 응용 프로그램에 작업으로 자바 스크립트에 대 한 범위를 테스트 365 스위트입니다.  명백한 연구 경로를 알려준 Qunit.js 그리고 그 후 바로, 받는 사람 Blanket.js.

QUnit을 사용 하자 단위 테스트를 설정 하 고 모듈에 그룹화 수 있습니다.  모듈은 관련된 테스트를 구성 하는 간단한 방법. (의도 한 대로 그것을 사용 오전 확실 하지, 하지만 작동 나를 위해 지금까지 지금까지 정의한 테스트의 작은 세트).

Blanket.js Qunit 통합 하 고 그것은 내게 실제 줄의 JavaScript 했다-그리고 더 중요 한 것은-하지 실제로 실행 된 테스트를 실행 하는 동안 표시 됩니다.  이것은 "범위"-다른 하는 동안 실행 라인 테스트에 의해 보호 됩니다..

좋은 테스트 사례를 설정 하 고 범위 보기 사이, 우리가 우리의 코드 결함 숨겨진 위험을 줄일 수 있습니다.  좋은 시간.

Qunit

Visual Studio를가지고 가정 프로젝트 설정, 자바 패키지를 다운로드 하 여 시작 http://qunitjs.com.  솔루션에 해당 CSS와 자바 스크립트를 추가 합니다.  이런 내 모습:

image

그림 1

당신이 볼 수 있습니다, 사용 하 던 1.13.0 당시 나는이 블로그 게시물을 작성. 다운로드 CSS 파일에 추가 하는 것을 잊지 마세요.

하는 방법, 다음 단계는 테스트 프로그램의 어떤 종류를 만들고 Qunit 비트 참조.  난 라는 "QuizUtil_test.html"와 같이 HTML 페이지를 만들어 "QuizUtil.js" 라는 스크립트 파일에 잔뜩 기능 테스트:

image 그림 2

다음은 코드:

<!문서 종류 html>
<html xmlns"http =://www.w3.org/ 1999/xhtml">
<머리>
    <제목>Qunit QuizUtil 테스트</제목>
    <링크 확인해"스타일 시트 =" href="../CSS/qunit-1.13.0.css" />
    <스크립트 유형= "텍스트/자바 스크립트" src="QuizUtil.js" 데이터 커버></스크립트>
    <스크립트 유형 ="텍스트/자바 스크립트" src ="qunit-1.13.0.js"></스크립트>
    <스크립트 유형 ="텍스트/자바 스크립트" src ="blanket.min.js"></스크립트>

    <스크립트>
        모듈("getIDFromLookup");
        테스트("QuizUtil getIDFromLookupField", 함수 () {
            var goodValue = "1;#폴 Galvin";

            동등한(getIDFromLookupField(goodValue) + 1, 2), "ID의 [" + goodValue + "] + 1 2 해야 합니다.";
            동등한(getIDFromLookupField(정의 되지 않음), 정의 되지 않음, "정의 되지 않은 입력된 인수가 정의 되지 않은 결과 반환 해야 합니다.");
            동등한(getIDFromLookupField(""), 정의 되지 않음, "빈 입력된 인수를 정의 되지 않은 값을 반환 해야 합니다.");
            동등한(getIDFromLookupField("gobbledigood3-thq;dkvn 이다;skfja sdjfbvubvqrubqer0873407t534piutheqw;vn"), 정의 되지 않음,"항상 반환 해야 결과 컨버터블을 정수로");
            동등한(getIDFromLookupField("2;#일부 다른 사람"), "2", "검사 [2;#일부 다른 사람].");
            동등한(getIDFromLookupField("9834524;#long 값"), "9834524", "큰 값 테스트입니다.");
            notEqual(getIDFromLookupField("5;#누구 든 지", 6), 6, "테스트는 notEqual (5 같지 6 이 샘플에 대 한: [5;#누구 든 지]");

        });

        모듈("htmlEscape");
        테스트("QuizUtil htmlEscape()", 함수 () {
            동등한(htmlEscape("<"), "&lt;", "이스케이프 연산자 보다 덜 ('<')");
            동등한(htmlEscape("<사업부 클래스 =  "someclass">일부 텍스트</div>"), "&lt;사업부 클래스 =&quot;someclass&quot;&gt는;일부 텍스트&lt;/div&gt는;", "더 복잡 한 테스트 문자열입니다.");
        });

        모듈("getDateAsCaml");
        테스트("QuizUtil getDateAsCaml()", 함수 () {
            동등한(getDateAsCaml(새로운 내용 날짜("12/31/2013")), "2013 12 31T:00:00:00", "테스트 하드 코딩 된 날짜: [12/31/2013]");
            동등한(getDateAsCaml(새로운 내용 날짜("01/05/2014")), "2014-01-05T:00:00:00", "테스트 하드 코딩 된 날짜: [01/05/2014]");
            동등한(getDateAsCaml(새로운 내용 날짜("01/31/2014")), "2014-01-31T:00:00:00", "테스트 하드 코딩 된 날짜: [01/31/2014]");
            동등한(getTodayAsCaml(), getDateAsCaml(새로운 내용 날짜()), "getTodayAsCaml() getDateAsCaml 동일 해야 합니다.(새 날짜())");
            동등한(getDateAsCaml("말도 값"), 정의 되지 않음, "넌센스 값의 날짜를 보십시오.");
            동등한(getDateAsCaml(정의 되지 않음), 정의 되지 않음, "의 날짜를 얻는 것을 시도 [정의 되지 않음] 날짜입니다.");
        });

        모듈("getParameterByName");
        테스트("QuizUtil getParameterByName (쿼리 문자열에서)", 함수 () {
            동등한(getParameterByName(정의 되지 않음), 정의 되지 않음, "얻는 것을 시도 정의 되지 않은 매개 변수는 정의 되지 않은 반환 해야 합니다.");
            동등한(getParameterByName("존재 하지 않습니다."), 정의 되지 않음, "우리가 알고 매개 변수가 존재 하지 않는 매개 변수 값을 좀 하려고 합니다.");

        });

        모듈("쿠키");
        테스트("QuizUtil 다양 한 쿠키 기능.", 함수 () {
            동등한(setCookie("테스트", "1", -1), getCookieValue("테스트"), "가져오기 설정 쿠키 작동 합니다.");
            동등한(setCookie("anycookie", "1", -1), true, "유효한 요리 설정 반환 해야 '사실'.");
            동등한(setCookie("미친 쿠키 이름 !@#$%"%\^&*(()?/><.,", "1", -1), true, "나쁜 쿠키 이름 설정 false를 반환 합니다 ''.");
            동등한(setCookie(정의 되지 않음, "1", -1), 정의 되지 않음, "쿠키 이름으로 정의 되지 않은 전달.");
            동등한(getCookieValue("존재 하지 않습니다."), "", "쿠키 테스트를 존재 하지 않습니다.");
        });

    </스크립트>
</머리>
<바디>
    <div id"qunit ="></div>
    <div id= "qunit 조명 기구"></div>

</바디>
</html>

여기 일어나 고 몇 가지:

  1. 내 코드 참조 (QuizUtil.js)
  2. Qunity.js 참조
  3. 일부 모듈 정의 (getIDFromLookup, 쿠키, 그리고 다른)
  4. 배치는 <div> ID가 "qunit".

다음, 그냥이 페이지를 당겨 하 고 당신이 이것 같은 것을 얻을합니다:

image

그림 3

위쪽에 보시 면, 몇 가지 옵션이 있습니다., 두 번째는 재미 있습니다:

  • 테스트를 통과 하는 숨기기: 꽤 분명 합니다.  문제 영역 및 불 요 반사 파의 많은 하지 그냥 볼 눈을 도울 수 있다.
  • 모듈: (드롭 다운): 이 테스트를 해당 그룹으로 테스트를 필터링 합니다..

테스트 스스로 – 몇 가지 의견 서:

  • 그것은 그것을 테스트할 수 처음에 코드를 작성 해야 한다는 말도 없이 간다.  그 규율을 적용 도울 수 있는 도구를 사용 하 여. 예를 들어, "GetTodayAsCaml 라는 함수를 했다()”.  이러면 아주 쓸만한 입력된 인수 걸리기 때문에 평등에 대 한 테스트를 하 고, 우리가 지속적으로 현재 날짜를 반영 하기 위해 테스트 코드를 업데이트 해야 합니다.  나는 데이터 입력된 매개 변수를 추가한 다음 CAML 형식으로 오늘 날짜를 원하는 경우 현재 날짜를 전달 리팩터링.
  • Qunit 프레임 워크 문서 자체 테스트 하 고 꽤 강력한 것 같습니다.  그것은 일치 여부를 테스트 같은 간단한 것 들을 할 수 있으며 ajax 스타일 호출에 대 한 지원 ("진짜" 또는 당신의 가장 좋아하는 mocker를 사용 하 여 모의).
  • -"정의 되지 않은"와 어떻게 지 사례를 통해 생각 하는 세력 또한 과정을 통과 또는 null 함수에 전달 됩니다.  그것은 죽은 간단 하 게 밖으로 이러한 시나리오를 테스트 합니다.  좋은 물건.

Blanket.js 범위

Blanket.js는 테스트 실행의 과정에서 실행 하는 코드의 실제 라인을 추적 하 여 Qunit을 보완 합니다.  그것은 통합 오른쪽 Qunit 그렇게 하더라도 그것은 완전히 별도 응용 프로그램, 그것은 정중 하 게 재생-정말 마치 그것은 하나의 완벽 한 애플 리 케이 션.

이것은 행동에 blanket.js:

image 그림 4

image

그림 5

(실제로 맨 "범위 사용" 확인란을 클릭 해야 [그림 참조 3] 이 수 있도록.)

그림에서 강조 표시 된 라인 5 내 테스트에 의해 실행 되지 않 았, 그래서 전체 범위를 원한다 면 실행 하도록 발생할 않는 테스트를 고안 해야.

다음이 단계에 따라 작업 하는 blanket.js를 얻을:

  1. 다운로드 http://blanketjs.org/.
  2. 프로젝트에 추가
  3. 테스트 프로그램 페이지 업데이트 (내 경우에는 QuizUtil_test.html) 다음과 같이:
    1. 참조 코드
    2. 장식 귀하 <스크립트> 이 같은 참조:
    <스크립트 유형= "텍스트/자바 스크립트" src="QuizUtil.js" 데이터 커버></스크립트>

Blanket.js "데이터-커버" 특성을 줍 고 그것의 마술을 않습니다.  Qunit에 후크, "범위 사용" 옵션 추가 UI 업데이트 봐라!

요약 (TL; 박사)

Qunit을 사용 하 여 테스트 사례를 작성.

  • 그것을 다운로드합니다
  • 프로젝트에 추가
  • 테스트 프로그램 페이지 작성
  • 테스트 만들기
    • 일부 쓸만한 수 코드 리팩터링
    • 창의력을 발휘해!  미친 생각, 불가능 한 시나리오 고 어쨌든 테스트.

Blanket.js를 사용 하 여 범위를 확인

  • Qunit 작동 하는지 확인
  • Blanket.js를 다운로드 하 고 프로젝트에 추가
  • 테스트 프로그램 페이지 추가:
    • Blanket.js에 대 한 참조 추가
    • "데이터-커버" 특성을 추가 여 <스크립트> 태그
  • Qunit 테스트 실행.

난 결코 전에 이런 한 초보적인 물건 시간의 소수에서 근무 했다. 

행복 한 테스트!

</끝>

undefined내 블로그를 구독.

에 지 저 귐에 나를 따르라합니다 http://www.twitter.com/pagalvin