2009-12-04 5 views
1

웹 사이트에서 사용자가 원하는 모양과 느낌의 옵션을 사용하고 싶습니다. 배경과 텍스트 색상, 이미지, 글꼴 등을 선택하기위한 인터페이스를 구상합니다. 정보를 저장하고 사용하는 가장 좋은 방법은 무엇인지 모르겠습니다. 나는 사용자에게 연결된 데이터베이스 테이블에 모든 옵션을 저장할 계획이다.사용자 별 CSS 템플릿 허용

각 사용자마다 CSS를 동적으로 생성하는 좋은 방법이 있습니까? CSS를 변경하고 저장하거나 각 페이지보기마다 다시 생성 할 때 CSS를 생성하는 것이 더 좋습니까? 이런 종류의 일을하기위한 패턴이 확립 되었습니까?

답변

2

정적 인 부분과 사용자 정의 할 수있는 CSS 부분을 구분하십시오. 그렇게하면 평상시처럼 CSS의 대부분을 계속 제공 할 수 있습니다.

맞춤 설정할 수있는 CSS를 동적으로 생성하십시오. 성능에 문제가 없다면 최적화 또는 고급 캐싱을 시도하지 마십시오.

유일한 잠재적 인 성능 문제는 브라우저가 사용자 지정 가능한 CSS를 캐시 할 수 없다는 것입니다. 그러나 어쨌든 브라우저에서 캐시하지 않으려면 사용자의 색 구성표가 편집 할 때 바로 업데이트되지 않을 수 있습니다.

성능 문제가있는 경우 ETags에 대해 걱정할 필요가 없습니다. ETags는 브라우저가 이미 가지고있는 구성 요소를 다시 다운로드하지 못하도록 설계되었지만 CSS의 사용자 지정 가능 부분은 매우 작을 수 있습니다.

성능 문제가 발생할 경우 HTML 페이지에 직접 사용자 정의 가능한 CSS를 인라인하는 것을 고려하십시오. 그러면 추가 HTTP 요청이 저장됩니다. 그러나 필요가 없다면이 작업을 수행하지 마십시오.

+0

"ETags는 브라우저에서 구성 요소를 다시 다운로드하지 않도록 설계되었습니다."- ETag는 서버 리소스가 CSS 내용을 재생성하는 데 드는 비용을 절약 할 수 있습니다. 일반적으로 ETag는 거의 즉시 계산됩니다. – Roman

+0

CSS 생성에 소요되는 시간은 거의 없습니다. 게다가 CSS를 다시 생성하지 않으면 어떻게 ETag를 계산할 것입니까? – ctford

+0

필자가 작성한대로 가능한 해결책은 사용자 스타일 (옵션) 버전을 유지하는 것입니다.이 버전은 사용자가 일부 옵션 (비즈니스 로직 책임)을 변경할 때마다 증가해야합니다. 이 버전은 ETag로 사용할 수 있으며 CSS 링크에 버전 매개 변수를 추가하여 '? v = version' 링크를 통해 변경 후 새 버전을 다운로드 할 수 있습니다. – Roman

1

먼저 생성 된 CSS에 적절한 캐싱 헤더를 사용하고 클라이언트가 요청할 때 CSS 원본의 유효성을 다시 검사하기 위해 ETag 헤더를 사용하십시오. 일부 빠른 설정 ETag 계산 알고리즘을 구현해야합니다 (예 : 사용자가 일부 설정을 변경하고 해당 값을 ETag로 반환 할 때마다 버전 필드 증가). 이 시나리오에서는 CSS가 사용자 에이전트 캐시에 저장되고 사용자가 F5 ETag를 누를 때에도 "변경 사항을 저장하고 저장하지만 실제로는 CSS를 생성하지 않고"각 페이지보기마다 재생성 "하도록 선택할 수 있습니다 클라이언트 측의 CSS가 여전히 유효한지 확인하는 데 사용됩니다.

물론, CSS는 일부 http 핸들러 (usercss.ashx 또는 이와 비슷한 것)에 의해 반환되어야합니다. 이 CSS에 대한 링크를 HTML 페이지에 포함 시키려면 캐시 된 콘텐츠 문제를 해결할 수있는 매개 변수를 추가해야합니다 (예 : '

). 내 경험에 따르면 사용자 CSS를 개별 리소스로 사용하도록 처리기를 사용하는 것이 좋습니다. HTML 페이지가 생성 될 때마다 HTML 페이지에 포함시키지 마십시오. 왜냐하면 마지막 경우에는 페이지가 생성 될 때마다 CSS를 다시 계산하거나 서버에 캐싱해야하기 때문에 두 경우 모두 다소 나쁜 아이디어입니다. 게다가,이 CSS는 다소 클 수 있습니다. 요청할 때마다 다운로드 할 이유가 없습니다.

+0

CSS를 다시 생성해야하는 이유를 설명 할 수 있습니까? HTML을 생성하는 것보다 리소스 집약적 인 방법이 더 많이 필요하다는 것을 알 수는 없습니다. 재생성해야하는 CSS는 매우 작습니다. 사용자 기본 설정에 의존하지 않는 모든 CSS를 포함 할 필요는 없습니다. – ctford

+0

일반적으로 CSS 재생성에 대해서는 아무 것도 없습니다.하지만 재생성하지 않고 데이터 조각을 클라이언트에 전달할 수있는 간단한 솔루션이 있다면 왜 사용하지 않을까요? 내가 설명하는 시나리오에서 CSS 재생성은 내 브라우저 캐시/ETag 방식을 구현하는 것이 더 쉽기 때문에 좋은 (심지어 최상의) 접근 방식이라고 생각합니다. 모두가 잘못 될 수 있고 나도 그렇습니다 :) – Roman

+0

정확한 상황에 달려 있다고 생각합니다. 다른 관점에서 문제를 보도록 도와 주셔서 감사합니다. – ctford

관련 문제