我想为 Angular 启动一个简单的 hello world 应用程序。
当我按照官方快速入门中的说明进行安装时,在我的项目中创建了 32,000 个文件。
我认为这是一些错误或者我错过了一些东西,所以我决定使用angular-cli,但在设置项目后我计算了 41,000 个文件。
我哪里做错了?我错过了一些非常明显的东西吗?
我想为 Angular 启动一个简单的 hello world 应用程序。
当我按照官方快速入门中的说明进行安装时,在我的项目中创建了 32,000 个文件。
我认为这是一些错误或者我错过了一些东西,所以我决定使用angular-cli,但在设置项目后我计算了 41,000 个文件。
我哪里做错了?我错过了一些非常明显的东西吗?
您的配置没有任何问题。
Angular(从 2.0 版开始)使用 npm 模块和依赖项进行开发。这是您看到如此大量文件的唯一原因。
角的基本设置中包含transpiler,分型依赖它们是必不可少仅用于开发。
完成开发后,您需要做的就是捆绑此应用程序。
捆绑您的应用程序后,将只有一个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
[请参阅此捆绑过程 ⇗ ]
正如一些人已经提到的: node_modules 目录(包的 NPM 位置)中的所有文件都是项目依赖项(所谓的直接依赖项)的一部分。除此之外,您的依赖项也可以有自己的依赖项等等(所谓的传递依赖项)。几万个文件没什么特别的。
因为你只被允许上传 10'000 个文件(见评论),我会使用打包引擎。该引擎将捆绑您所有的 JavaScript、CSS、HTML 等,并创建一个捆绑包(或更多,如果您指定它们)。您的 index.html 将加载这个包,就是这样。
我是 webpack 的粉丝,所以我的 webpack 解决方案将创建一个应用程序包和一个供应商包(有关完整的工作应用程序,请参见此处https://github.com/swaechter/project-collection/tree/master/web-angular2-示例):
索引.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 1.* 的一个很好的解决方案,因为它最大限度地减少了每个 Http 请求的开销。您只有对 index.html 和每个包的请求 - 但不是 100 - 200 个文件。目前,这是要走的路。
另一方面,Http 2 试图最小化 Http 开销,因此它基于流协议。该流能够双向通信(客户端 <--> 服务器),因此,可以进行更智能的资源加载(您只加载所需的文件)。该流消除了大部分 Http 开销(更少的 Http 往返)。
但它和 IPv6 一样:人们真正使用 Http 2 还需要几年时间
您需要确保您只是从Angular CLI生成的项目中部署 dist(distributable 的缩写)文件夹。这允许该工具获取您的源代码及其依赖项,并且只为您提供运行应用程序所需的内容。
话虽如此,在通过`ng build --prod 进行生产构建方面,Angular CLI 存在/存在问题
昨日(2016年8月2日)释放已完成其切换的构建机制,从西兰花+ systemjs到的WebPack成功地处理产品构建。
基于这些步骤:
ng new test-project
ng build --prod
我看到此处列出的14 个文件中的文件dist
夹大小为1.1 MB:
./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
注意当前要安装 angular cli 的 webpack 版本,您必须运行...npm install angular-cli@webpack -g