Angular에 대한 간단한 hello world 앱을 시작하고 싶었습니다.
공식 빠른 시작 의 지침에 따라 설치시 프로젝트에 32,000 개의 파일이 생성되었습니다.
나는 이것이 실수이거나 무언가를 놓쳤다 고 생각했기 때문에 angular-cli 을 사용하기로 결정 했지만 프로젝트를 설정 한 후 41,000 개의 파일을 계산했습니다.
내가 어디로 잘못 갔니? 내가 정말로 분명한 것을 놓치고 있습니까?
Angular에 대한 간단한 hello world 앱을 시작하고 싶었습니다.
공식 빠른 시작 의 지침에 따라 설치시 프로젝트에 32,000 개의 파일이 생성되었습니다.
나는 이것이 실수이거나 무언가를 놓쳤다 고 생각했기 때문에 angular-cli 을 사용하기로 결정 했지만 프로젝트를 설정 한 후 41,000 개의 파일을 계산했습니다.
내가 어디로 잘못 갔니? 내가 정말로 분명한 것을 놓치고 있습니까?
답변:
구성에 아무런 문제가 없습니다.
Angular (버전 2.0부터)는 개발을 위해 npm 모듈과 종속성을 사용합니다. 그것이 수많은 파일을 보는 유일한 이유입니다.
각도의 기본 설정은 transpiler, typings 종속성이 포함되어 필수 개발 용으로 만 사용합니다.
개발이 끝나면이 응용 프로그램을 번들로 제공하기 만하면됩니다.
응용 프로그램을 번들링 한 후에는 bundle.js
서버에 배포 할 수있는 파일이 하나만 있습니다.
'transpiler' 는 컴파일러 일뿐입니다. @omninonsense를 추가해 주셔서 감사합니다.
Typical Angular2 Project
NPM 패키지 파일 (개발) 실제 파일 (배포)
@angular 3,236 1
rxJS 1,349 1*
core-js 1,341 2
typings 1,488 0
gulp 1,218 0
gulp-typescript 1,243 0
lite-server 5,654 0
systemjs-builder 6,470 0
__________________________________________________________________
Total 21,999 3
*
: bundled with @angular
[ 동고 과정은 see ]
-3
합계를하지 않은 것으로 생각 했지만 지금은 :)
개발 구성 에는 아무런 문제가 없습니다 .
프로덕션 구성에 문제가 있습니다 .
"Angular 2 프로젝트"또는 "JS 기반의 모든 프로젝트"를 개발할 때 모든 파일을 사용할 수 있으며 모든 파일을 시도 할 수 있으며 모든 파일을 가져올 수 있습니다. 이 프로젝트를 제공하려는 경우하지만 당신은 할 필요가 COMBINE 모든 구성 파일 및 쓸모없는 파일을 제거.
이 파일들을 결합하기위한 많은 옵션이 있습니다 :
여러 사람들이 이미 언급했듯이 node_modules 디렉토리의 모든 파일 (패키지의 NPM 위치)은 프로젝트 종속성 (소위 직접 종속성)의 일부입니다. 그 외에도 종속성은 고유 한 종속성 등을 가질 수 있습니다 (소위 전이 종속성). 수만 개의 파일은 특별한 것이 아닙니다.
10,000 개의 파일 만 업로드 할 수 있기 때문에 (댓글 참조) 번 들러 엔진을 사용합니다. 이 엔진은 모든 JavaScript, CSS, HTML 등을 번들로 묶어 하나의 번들을 생성합니다 (또는 지정한 경우 그 이상). index.html이이 번들을로드합니다.
나는 웹 팩의 팬이므로 웹 팩 솔루션은 응용 프로그램 번들과 공급 업체 번들을 만듭니다 (전체 작동하는 응용 프로그램은 여기 https://github.com/swaechter/project-collection/tree/master/web-angular2- 참조) 예 ) :
index.html
<!DOCTYPE html>
<html>
<head>
<base href="/">
<title>Webcms</title>
</head>
<body>
<webcms-application>Applikation wird geladen, bitte warten...</webcms-application>
<script type="text/javascript" src="vendor.bundle.js"></script>
<script type="text/javascript" src="main.bundle.js"></script>
</body>
</html>
webpack.config.js
var webpack = require("webpack");
var path = require('path');
var ProvidePlugin = require('webpack/lib/ProvidePlugin');
var CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin');
var UglifyJsPlugin = require('webpack/lib/optimize/UglifyJsPlugin');
/*
* Configuration
*/
module.exports = {
devtool: 'source-map',
debug: true,
entry: {
'main': './app/main.ts'
},
// Bundle configuration
output: {
path: root('dist'),
filename: '[name].bundle.js',
sourceMapFilename: '[name].map',
chunkFilename: '[id].chunk.js'
},
// Include configuration
resolve: {
extensions: ['', '.ts', '.js', '.css', '.html']
},
// Module configuration
module: {
preLoaders: [
// Lint all TypeScript files
{test: /\.ts$/, loader: 'tslint-loader'}
],
loaders: [
// Include all TypeScript files
{test: /\.ts$/, loader: 'ts-loader'},
// Include all HTML files
{test: /\.html$/, loader: 'raw-loader'},
// Include all CSS files
{test: /\.css$/, loader: 'raw-loader'},
]
},
// Plugin configuration
plugins: [
// Bundle all third party libraries
new CommonsChunkPlugin({name: 'vendor', filename: 'vendor.bundle.js', minChunks: Infinity}),
// Uglify all bundles
new UglifyJsPlugin({compress: {warnings: false}}),
],
// Linter configuration
tslint: {
emitErrors: false,
failOnHint: false
}
};
// Helper functions
function root(args) {
args = Array.prototype.slice.call(arguments, 0);
return path.join.apply(path, [__dirname].concat(args));
}
장점 :
단점 :
면책 조항 : 이것은 각 HTTP 요청에 대한 오버 헤드를 최소화하기 때문에 Http 1. *에 대한 좋은 솔루션입니다. index.html 및 각 번들에 대한 요청 만 있지만 100-200 파일에 대한 요청은 없습니다. 현재, 이것은 갈 길입니다.
반면에 Http 2는 Http 오버 헤드를 최소화하려고 시도하므로 스트림 프로토콜을 기반으로합니다. 이 스트림은 양방향 (클라이언트 <-> 서버)으로 통신 할 수 있으며 그로 인해보다 지능적인 리소스로드가 가능합니다 (필요한 파일 만로드). 이 스트림은 많은 Http 오버 헤드 (Http 왕복이 적음)를 제거합니다.
그러나 IPv6과 동일합니다. 사람들이 실제로 Http 2를 사용할 때까지 몇 년이 걸립니다.
angular-cli
는 이미 번 들러 (동일한 제안 된 웹 팩)와 함께 제공되는 것을 사용했기 때문에 필요하지 않습니다 .
Angular CLI에 의해 생성 된 프로젝트에서 dist (배포 가능)의 폴더를 배포해야합니다 . 이를 통해 도구가 소스 코드와 종속성을 가져 와서 응용 프로그램을 실행하는 데 필요한 것만 제공 할 수 있습니다.
ng build --prod를 통한 프로덕션 빌드와 관련하여 Angular CLI에 문제가 있다고합니다.
어제 (2016 년 8 월 2 일) 제작 메커니즘을 브로콜리 + systemjs 에서 웹팩 으로 전환하여 프로덕션 빌드를 성공적으로 처리 하는 릴리스가 완료 되었습니다.
이 단계를 기반으로 :
ng new test-project
ng build --prod
나는보고하고 dist
의 폴더 크기 1.1 MB 어 크로스 (14 개) 파일 여기에 나열을 :
./app/index.js
./app/size-check.component.css
./app/size-check.component.html
./favicon.ico
./index.html
./main.js
./system-config.js
./tsconfig.json
./vendor/es6-shim/es6-shim.js
./vendor/reflect-metadata/Reflect.js
./vendor/systemjs/dist/system.src.js
./vendor/zone.js/dist/zone.js
참고 현재 각도 cli의 웹팩 버전을 설치하려면 다음을 실행해야합니다.npm install angular-cli@webpack -g
Angular 자체에는 많은 종속성이 있으며 CLI의 베타 버전은 4 배 더 많은 파일을 다운로드합니다.
간단한 프로젝트를 만드는 방법은 파일을 줄입니다 ( "10K 파일 만") https://yakovfain.com/2016/05/06/starting-an-angular-2-rc-1-project/
아무도 여기에 설명 된대로 Ahead-of-Time Compilation을 언급하지 않은 것 같습니다 : https://angular.io/docs/ts/latest/cookbook/aot-compiler.html
지금까지 Angular에 대한 나의 경험은 AoT가 로딩 시간이 거의없이 가장 작은 빌드를 생성한다는 것입니다. 여기서 가장 중요한 질문은 프로덕션에 몇 개의 파일 만 보내면됩니다.
템플릿이 "Ahead of Time"으로 컴파일되므로 Angular 컴파일러는 프로덕션 빌드와 함께 제공되지 않기 때문입니다. HTML 템플릿 마크 업이 자바 스크립트 명령어로 변환되어 원래의 HTML로 리버스 엔지니어링하기가 매우 어려울 수도 있습니다.
dev에서 AoT 빌드의 Angular 앱에 대한 다운로드 크기, 파일 수 등을 보여주는 간단한 비디오를 만들었습니다. 여기에서 볼 수 있습니다.
데모 소스 코드는 다음과 같습니다.
https://github.com/fintechneo/angular2-templates
그리고 다른 모든 사람들이 여기에서 말했듯이 개발 환경에 많은 파일이있을 때 아무런 문제가 없습니다. 이것이 Angular와 함께 제공되는 모든 의존성 및 다른 많은 현대 프레임 워크와 함께하는 방식입니다. 그러나 여기서 차이점은 프로덕션으로 배송 할 때 몇 개의 파일로 압축 할 수 있어야한다는 것입니다. 또한 git 저장소에 이러한 종속성 파일을 모두 원하지는 않습니다.
이것은 실제로 Angular에 국한된 것이 아니며, NodeJs / npm 생태계를 툴링에 사용하는 거의 모든 프로젝트에서 발생합니다.
이러한 프로젝트는 node_modules 폴더 안에 있으며 직접 종속성을 실행해야하는 통과 종속성입니다.
노드 생태계 모듈은 일반적으로 작기 때문에 자체 개발하는 대신 모듈 형태로 필요한 것을 대부분 가져 오는 경향이 있습니다. 여기에는 유명한 왼쪽 패드 기능과 같은 작은 것들이 포함될 수 있습니다. 왜 운동이 아닌 경우 직접 작성합니까?
따라서 실제로 많은 파일을 보유하고있는 것은 모든 것이 매우 모듈 식이며 모듈 작성자는 다른 모듈을 자주 재사용한다는 의미입니다. 이러한 모듈 식의 용이성은 아마도 노드 생태계가 그렇게 빠르게 성장한 주된 이유 중 하나 일 것입니다.
원칙적으로 이것은 문제를 일으키지 않아야하지만 Google 앱 엔진 파일 수 제한에 도달 한 것 같습니다. 이 경우 node_modules를 앱 엔진에 업로드하지 않는 것이 좋습니다.
대신 응용 프로그램을 로컬로 빌드하고 번들 파일로만 Google 앱 엔진에 업로드하지만 앱 엔진 자체에는 빌드하지 마십시오.
최근에 각도 cli를 사용하여 새 프로젝트를 만들고 node_modules 폴더가 270MB이므로 그렇습니다. 그러나 각도 세계에 대한 대부분의 새로운 개발자는 이것이 확실하며 유효합니다. 간단한 새 프로젝트의 경우 종속성을 조금씩 낮추는 것이 합리적입니다.) 모든 패키지가 무엇에 의존하는지 알지 못하는 것은 특히 처음으로 클리프를 시도하는 새로운 개발자에게 다소 방해가 될 수 있습니다. 대부분의 기본 자습서에서는 내 보낸 파일 만 필요한 배치 설정에 대해 설명하지 않습니다. 나는 각도 공식 웹 사이트에서 제공되는 자습서조차도 간단한 프로젝트를 배포하는 방법에 대해 이야기한다고 생각하지 않습니다.
파일 시스템이 심볼릭 링크를 지원하는 경우 최소한 이러한 파일을 모두 숨겨진 폴더로 전달할 수 있으므로 스마트 도구와 같은 스마트 도구 tree
는 기본적으로 표시되지 않습니다.
mv node_modules .blergyblerp && ln -s .blergyblerp node_modules
이를 위해 숨겨진 폴더를 사용하면 파일이 개정 관리에 저장하거나 배포에서 직접 사용할 필요가없는 빌드 관련 중간 파일이라는 것을 이해하는 데 도움이 될 수 있습니다.