인라인과 외부 자바 스크립트는 언제 사용해야합니까?


129

성능과 유지 관리 용이성 측면에서 외부 스크립트를 포함 시키거나 HTML 코드와 함께 인라인으로 작성해야하는시기를 알고 싶습니다.

이것에 대한 일반적인 관행은 무엇입니까?

실제 시나리오-클라이언트 측 양식 유효성 검사가 필요한 여러 HTML 페이지가 있습니다. 이를 위해이 모든 페이지에 포함 된 jQuery 플러그인을 사용합니다. 그러나 문제는, 나는 :

  • 이 스크립트를 인라인으로 구성하는 코드를 작성 하시겠습니까?
  • 이 모든 HTML 페이지에서 공유하는 하나의 파일에 모든 비트를 포함 하시겠습니까?
  • html 페이지마다 하나씩 별도의 외부 파일에 각 비트를 포함 시킵니까?

감사.

답변:


114

이 답변이 처음 게시되었을 때 (2008), 규칙은 간단했습니다. 모든 스크립트는 외부 여야합니다. 유지 보수 및 성능 모두.

(성능은? 코드가 분리되어 있으면 브라우저에서 쉽게 캐시 할 수 있기 때문입니다.)

JavaScript는 HTML 코드에 속하지 않으며 <, 와 같은 특수 문자가 포함되어 있으면 >문제가 발생할 수도 있습니다.

요즘에는 웹 확장 성이 변경되었습니다. 여러 HTTP 요청의 대기 시간으로 인해 요청 수를 줄이는 것이 유효한 고려 사항이되었습니다. 이렇게하면 답이 더 복잡해집니다. 대부분의 경우 JavaScript 외부를 유지하는 것이 좋습니다. 그러나 특정 경우, 특히 매우 작은 코드 조각은 사이트의 HTML에 삽입하는 것이 좋습니다.


6
@Nick : 대부분의 문제를 극복 할 수 있습니다. 그러나 처음에는 생성하지 않는 것이 좋습니다.
— Konrad Rudolph

17
때로는 인라인 할 때 성능이 향상됩니다. google.com 의 출처를 확인하십시오 . 그들은 무엇을하고 있는지 알고 있습니다.
— callum

13
@callum Google은 웹 사이트의 99.999999 %와 다른 사용 사례를 가지고 있습니다. 물론 그들은 매우 신중하게, 심지어 가장 작은 차이까지 측정 합니다. 그러나 특정 유스 케이스에서 인라인이 더 잘 작동한다는 사실을 발견했다고해서 (아마도 스크립트가 매우 자주 변경되기 때문입니까?) 그렇다고 일반적인 규칙을 도출 할 수 있거나 심지어 "종래의"규칙을 무시해야한다는 의미는 아닙니다. 규칙 (스크립트를 외부화하기 위해).
— Konrad Rudolph

8
@KonradRudolph-동의, 일반적인 규칙은 Google의 접근 방식에서 파생되지 않아야합니다. 나는 그것이 당신의 대답 에서 규칙 에 의문을 제기 할 가치가 있다는 암시라고 말하고 있습니다 . 어쨌든 구글이 HTTP 요청을 줄이려는 이유는 사이트의 0.000001 % 이상에 도움이 될 수 있다고 생각합니다. 대역폭은 점점 높아지고 있지만 왕복 시간은 동일하게 유지됩니다. 전체 직렬 HTTP 요청을 제거하는 것이 때때로 외부 JS의 캐싱 이점보다 낫습니다. 물론 JS의 크기에 따라 다릅니다.
— callum

5
@callum 이것이 사실이지만 캐싱에 대한 요점은 여전히 ​​남아 있고 중요합니다. 왕복 횟수를 줄이면 방문자가 돌아 오지 않고 (페이지 방문 횟수가 충분하지 않아) 콘텐츠가 너무 자주 변경되어 스크립트 파일을 캐싱해도 이점이없는 경우에만 중요합니다.
— Konrad Rudolph

31

유지 관리 성은 분명히 외부를 유지하는 이유이지만 구성이 한 줄짜리 (또는 일반적으로 HTTP 오버 헤드보다 짧아서 파일을 외부로 만들 때 얻을 수있는 경우) 인라인으로 유지하는 것이 성능면에서 더 좋습니다. 각 HTTP 요청은 실행 시간 및 트래픽 측면에서 약간의 오버 헤드를 생성한다는 점을 항상 기억하십시오.

당연히이 모든 것이 코드가 두 줄보다 길고 실제로 한 페이지에만 국한되지 않는 순간에는 관련이 없습니다. 해당 코드를 재사용 할 수있는 순간을 외부 코드로 만드십시오. 그렇지 않으면 크기를보고 결정하십시오.


5
그것은 나의 관심사 중 하나입니다. 몇 줄의 코드에 대해 별도의 HTTP 요청이 있으면 낭비되는 것 같습니다.
— Dan Burzo

코드에 대한 샘플 구성을 게시 할 수 있습니까? IMO가 300 자 미만이고 페이지에 따라 다르면 인라인으로 표시하십시오.
— Horst Gutmann

이것은 최고의 답변 imo
— sgarcia.dev

@Dan은 별도의 요청이 처음에만 발생한다는 것을 명심하십시오. 사용자가 페이지를 두 번 이상로드 할 것으로 예상되는 경우 캐시 된 외부 (몇 줄이라도)는 n = 2 + 페이지로드에서 와이어를 통해 몇 줄의 바이트를 기다리는 것보다 훨씬 빠릅니다.
— jinglesthula

@HorstGutmann 파일 외부 유지 관리가 유지 관리에 어떤 도움이됩니까? 나는 개인적으로 가능할 때마다 외부 js를 선호하지만 유지 관리하기 쉬운 객관적인 것이 있습니까?
— jinglesthula

21

자바 스크립트 외부화는 yahoo 성능 규칙 중 하나입니다. http://developer.yahoo.com/performance/rules.html#external

스크립트를 항상 외부화해야한다는 강력하고 빠른 규칙은 일반적으로 좋은 방법이지만, 경우에 따라 일부 스크립트와 스타일을 인라인하고 싶을 수도 있습니다. 그러나 성능을 향상시킬 수있는 인라인 만 인라인해야합니다 (이를 측정했기 때문에).


1
야후는 또한 모든 자바 스크립트를 하나의 HTTP 호출에 추가 할 것을 권장한다. 이것은 개발 중에 스크립트가 모두 같은 파일에 있어야한다는 것을 의미하지는 않는다.
— Paul Shannon

또한 위에서 언급 한 것처럼 HTTP / 2는 "1 호출"방법도 변경합니다.
— jinglesthula

19

성능에만 관심이 있다면이 스레드의 대부분의 조언이 잘못되어 SPA 시대에 점점 더 잘못되고 있습니다. 여기서 JS 코드 없이는 페이지가 쓸모 없다고 가정 할 수 있습니다. SPA 페이지로드 시간을 최적화하고 다른 브라우저에서 이러한 결과를 확인하는 데 많은 시간을 보냈습니다. 전반적으로 HTML을 다시 조정하여 성능이 향상 될 수 있습니다.

최상의 성능을 얻으려면 페이지를 2 단계 로켓으로 생각해야합니다. 이 두 단계는 대략 <head>및 <body>단계에 해당 하지만 대신 <static>및 로 생각하십시오 <dynamic>. 정적 부분은 기본적으로 가능한 한 빨리 응답 파이프를 밀어 넣는 문자열 상수입니다. 쿠키를 설정하는 미들웨어를 많이 사용하는 경우 (http 콘텐츠를 보내기 전에 설정해야 함), 원칙적으로 응답 버퍼를 플러시하고 템플릿 코드 (면도기, PHP, 등) 서버에. 이것은 어렵게 들릴 수 있지만, 사소한 것이므로 잘못 설명하고 있습니다. 짐작 하셨겠지만이 정적 부분에는 모든 자바 스크립트가 인라인되고 축소되어 있어야합니다. 그것은 다음과 같이 보일 것입니다

<!DOCTYPE html>
     <html>
         <head>
             <script>/*...inlined jquery, angular, your code*/</script>
             <style>/* ditto css */</style>
         </head>
         <body>
             <!-- inline all your templates, if applicable -->
             <script type='template-mime' id='1'></script>
             <script type='template-mime' id='2'></script>
             <script type='template-mime' id='3'></script>

이 부분을 무선으로 전송하는 데 드는 비용이 들지 않기 때문에 클라이언트는 서버에 연결 한 후 약 5ms + 대기 시간이 걸리기 시작할 것입니다. 서버가 상당히 가까이 있다고 가정하면이 대기 시간은 20ms에서 60ms 사이 일 수 있습니다. 브라우저는이 섹션을 가져 오자마자이 섹션을 처리하기 시작하며 처리 시간은 일반적으로 20 배 이상의 전송 시간을 지배합니다. 이제이 <dynamic>부분 의 서버 측 처리를위한 상환 기간 입니다.

브라우저 (크롬, 나머지 20 % 느리게)가 인라인 jquery + signalr + angular + ng animate + ng touch + ng route + lodash를 처리하는 데 약 50ms가 걸립니다. 그것은 그 자체로도 놀랍습니다. 대부분의 웹 응용 프로그램은 인기있는 모든 라이브러리에 비해 코드가 적지 만, 많이 가지고 있다고 가정하면 클라이언트에서 대기 시간 + 100ms의 처리 시간을 얻습니다 (이 대기 시간 승리는 두 번째 전송 청크에서 발생합니다). 두 번째 청크가 도착할 때까지 모든 js 코드와 템플릿을 처리했으며 DOM 변환을 시작할 수 있습니다.

이 방법이 인라인 개념과 직교한다고 반대 할 수도 있지만 그렇지 않습니다. 인라인 대신 cdns 또는 자신의 서버에 연결하는 경우 브라우저는 다른 연결을 열고 실행을 지연시켜야합니다. 이 실행은 기본적으로 무료이므로 (서버 측이 데이터베이스와 통신하기 때문에) 이러한 점프는 점프하지 않는 것보다 비용이 많이 든다는 것이 분명해야합니다. 외부 js가 더 빠르게 실행된다는 브라우저 문제가 있다면 어떤 요소가 지배적인지 측정 할 수 있습니다. 내 측정에 따르면이 단계에서 추가 요청이 성능을 저하시키는 것으로 나타났습니다.

SPA 앱의 최적화 작업을 많이합니다. 사람들은 데이터 볼륨이 큰 문제라고 생각하지만 일반적으로 지연 시간이 길고 실행이 지배적이라고 생각하는 것이 일반적입니다. 내가 나열된 축소 된 라이브러리는 최대 300kb의 데이터를 추가하며 2mbit 3g / 4g 전화에서 68kb gzipped 또는 200ms 다운로드로 동일한 데이터를 가지고 있는지 확인하기 위해 동일한 전화에서 걸리는 대기 시간입니다. 모바일 대기 시간 세금 (전화 대 타워 대기 시간)이 여전히 적용되기 때문에 프록시 캐시 된 경우에도 캐시에 이미 저장되어 있습니다. 한편, 첫 번째 홉 대기 시간이 짧은 데스크톱 연결은 일반적으로 더 높은 대역폭을 갖습니다.

요컨대, 지금 (2014), 모든 스크립트, 스타일 및 템플릿을 인라인하는 것이 가장 좋습니다.

편집 (2016 년 5 월)

JS 응용 프로그램이 계속 커지고 페이로드 중 일부가 이제 최대 3MB 이상의 축소 코드를 쌓을 때 최소한 공통 라이브러리가 더 이상 인라인되지 않아야한다는 것이 분명해졌습니다.


나는 <dynamic> 부분 부분의 서버 측 처리를 위해 상각 된 창을 얻지 못했습니다 . 서버는 필요한 것을 처리 한 다음 렌더링 된 html (head + body) 전체를 처리합니다. 그 후에 필요합니까?
— BornToCode

@BornToCode 아이디어는 클라이언트에게 서버 측에서해야 할 일을 동시에 수행하는 것입니다. 클라이언트 라이브러리를 해석해야하기 때문에 - 그것은 수행하기 전에 시작하는 프로세스를 얻기 위해 더 나은 모든 서버에서 계산을. 상각 기간은 클라이언트가 JS를 처리하는 데 걸리는 시간입니다. 2 단 로켓을 오케스트레이션하면 해당 창이 무료로 제공됩니다.
— Gleno


9

사실, 인라인 자바 스크립트를 사용하는 꽤 확실한 경우가 있습니다. js가 충분히 작 으면 (한 줄짜리) 두 가지 요인 때문에 자바 스크립트 인라인을 선호하는 경향이 있습니다.

  • 지역 . 일부 자바 스크립트의 동작을 확인하기 위해 외부 파일을 탐색 할 필요가 없습니다.
  • AJAX . AJAX를 통해 페이지의 일부 섹션을 새로 고치면 바인딩하는 방법에 따라 해당 섹션에 대한 모든 DOM 핸들러 (onclick 등) 가 손실 될 수 있습니다. 예를 들어, 사용 jQuery하면 live또는 delegate메소드를 사용하여 이를 피할 수 있지만 js가 충분히 작 으면 인라인으로 배치하는 것이 좋습니다.

5

항상 외부 스크립트를 사용해야하는 또 다른 이유는 컨텐츠 보안 정책 (CSP)으로 쉽게 전환하기 위함 입니다. CSP는 기본적으로 모든 인라인 스크립트를 금지하여 사이트를 XSS 공격에 더욱 강하게 만듭니다.


4

필요한 코드를 살펴보고 필요한만큼 별도의 파일로 나눕니다. 모든 js 파일에는 하나의 "논리적 세트"기능 만 포함됩니다. 모든 로그인 관련 기능을위한 하나의 파일.

그런 다음 각 HTML 페이지에서 사이트를 개발하는 동안 필요한 페이지 만 포함하십시오. 당신이 당신의 위치에 생방송 할 때 페이지에 필요한 모든 js 파일을 하나의 파일로 결합하여 최적화 할 수 있습니다.


4

인라인 javascipt에 제공 할 수있는 유일한 방어 방법은 .net MVC와 함께 강력한 형식의보기를 사용할 때 내가 찾은 자바 스크립트 중 c # 변수를 참조 할 수 있다는 것입니다.


3

세 가지 고려 사항 :

  • 얼마나 많은 코드가 필요합니까 (때때로 라이브러리는 일류 소비자입니다)?
  • 특이성 :이 코드는이 특정 문서 나 요소의 맥락에서만 작동합니까?
  • 문서 내부의 모든 코드는 더 길고 느리게 만드는 경향이 있습니다. SEO 고려 사항은 분명히 내부 스크립팅을 최소화한다는 것을 분명히합니다 ...

2

Firebug를 사용하여 외부 스크립트를 디버깅하기도 쉽습니다. 나는 JavaScript를 단위 테스트하고 모든 외부 도움을 얻는 것을 좋아합니다. PHP 코드와 HTML에서 JavaScript를 보는 것이 싫습니다.


2

JavaScript를 외부에 유지하는 요점 :

ASP.NET 3.5SP1은 최근 Composite 스크립트 리소스를 생성하는 기능을 도입했습니다 (많은 js 파일을 하나로 병합). 이것에 대한 또 다른 이점은 웹 서버 압축이 켜져있을 때 약간 큰 파일 하나를 다운로드하면 더 작은 압축 파일 (http 오버 헤드, 라운드 트립 등)보다 작은 압축 비율이 더 좋아집니다. 초기 페이지로드를 절약 한 다음 위에서 언급 한대로 브라우저 캐싱이 시작됩니다.

ASP.NET 외에도이 스크린 캐스트는 다음과 같은 이점을 자세히 설명합니다. http://www.asp.net/learn/3.5-SP1/video-296.aspx


2

외부 스크립트의 또 다른 숨겨진 이점은 jslint 와 같은 구문 검사기를 통해 쉽게 실행할 수 있다는 것 입니다 . 그것은 많은 가슴 아프고 찾기 어려운 IE6 버그로부터 당신을 구할 수 있습니다.


1

시나리오에서 페이지간에 공유 된 하나의 파일에 외부 내용을 작성하는 것이 좋습니다. 위에 언급 된 모든 내용에 동의합니다.


1

초기 프로토 타이핑 중에는 빠른 반복의 이점을 위해 코드를 인라인으로 유지하지만 프로덕션에 도달 할 때까지 모두 외부로 만들어야합니다.

모든 Javascript를 외부에 배치 할 수 없다면 손에 나쁜 디자인이 있고 데이터와 스크립트를 리팩토링해야한다고 감히 말하고 싶습니다.


1

Google은 페이지 순위 측정에로드 시간을 포함 시켰습니다. 많은 인라인을 사용하면 스파이더가 페이지를 통해 크롤링하는 데 시간이 더 오래 걸리므로 포함해야하는 경우 페이지 순위에 영향을 줄 수 있습니다. 어쨌든 다른 전략이 순위에 영향을 줄 수 있습니다.


1

글쎄, 한 페이지 웹 사이트를 만들 때 스크립트를 여러 페이지에서 공유 할 필요가 없으므로 인라인을 사용해야한다고 생각합니다.


-3

인라인 j는 항상 유지 관리하기 어렵 기 때문에 항상 외부 J를 사용하십시오.

또한 대부분의 개발자는 js를 외부에서 사용하도록 권장하므로 외부 js를 전문적으로 사용해야합니다.

나 자신은 외부 js를 사용합니다.


2
전문적으로 필요하십니까? 왜? 누가 그렇게 말합니까?
— 시야
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.