为每个Angular项目生成大量文件

Mos*_*ham 573 javascript angular

我想为Angular开始一个简单的hello world应用程序.

当我按照官方快速入门中的说明进行操作时,安装程序在我的项目中创建了32,000个文件.

我认为这是一些错误或者我错过了什么,所以我决定使用angular-cli,但在设置项目后我计算了41,000个文件.

我哪里做错了?我错过了一些非常明显的东西吗?

Bhu*_*kar 351

您的配置没有任何问题.

Angular(从2.0版开始)使用npm模块和依赖项进行开发.这是你看到如此大量文件的唯一原因.

Angular的基本设置包含转换器,类型依赖关系,它们仅对于开发目的是必不可少的.

完成开发后,您需要做的就是捆绑此应用程序.

捆绑应用程序后,只有一个bundle.js文件可以在服务器上部署.

'transpiler'只是一个编译器,感谢@omninonsense添加它.

  • 关于所有参与者,我不确定语义论证是否与OP的问题真正相关^^ (75认同)
  • "transpiler"只是一个编译器. (63认同)
  • @HunterMcMillen字节代码和/或机器代码是另一种语言.术语"transpiler"没有"编译器"的附加含义. (31认同)
  • 但编译成另一种语言而不是字节代码或机器代码 (29认同)
  • 它通常还会为依赖项及其依赖项等提供测试数据和测试以及构建工具. (7认同)
  • 编译器是一个程序,它在A中获取代码,产生时间T,并在最终B中转换T.B通常是真实CPU的二进制代码,但也可以是另一种编程语言.编译器不需要生成字节代码. (5认同)
  • @Navin这不是什么依赖地狱意味着什么; 检查定义.npm是少数几个不会因设计而受到依赖地狱影响的软件包经理之一. (4认同)
  • 欢迎来到J̶a̶v̶a̶S̶c̶r̶i̶p̶t̶依赖地狱.一旦你开始更新组件,它就会启动:) (3认同)
  • @DanPantry如果我们在评论部分没有偏离主题的语义参数,我不确定我是否会记得我就是这样! (3认同)
  • 如果我正确地阅读答案,这是否意味着Angular 2在外部模块上有40k(!!)依赖(包括传递)?或者你可以扩展*Angular 2之间的链接使用npm模块和依赖项进行开发*和这样一个不切实际的文件数量? (2认同)
  • 正如 Tei 解释的那样,@strizzwald 编译器是一个将源语言翻译成目标语言的程序。目标语言也是人类可读的这一事实并不意味着编译器是一个编译器。但是,您可以使用 _transpiler_ 作为“源到源”编译器的同义词;在提交评论时,我并不是要暗示这个词有问题。:) (2认同)

Ank*_*ngh 140

                                Typical Angular2 Project
Run Code Online (Sandbox Code Playgroud)

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  
Run Code Online (Sandbox Code Playgroud)

*: bundled with @angular

[ 看捆绑过程this ]

  • 我猜**`-3`**是因为没有做总和,但现在我有:) (23认同)

hur*_*ane 50

您的开发配置没有任何问题.

出错了生产配置.

当您开发"Angular 2 Project"或"任何基于JS的项目"时,您可以使用所有文件,您可以尝试所有文件,您可以导入所有文件.但是如果你想要服务这个项目,你需要组合所有结构化文件并摆脱无用的文件.

将这些文件组合在一起有很多选项:

  • 我同意你的意见,但OP似乎有一个XY问题 (4认同)
  • 您不应该(需要引用)在服务器上将文件连接在一起.最多,我会使用一个转换器. (2认同)
  • @DanPantry我同意你的看法.但在评论提问者说"因为我的部署(谷歌应用程序引擎)只允许10K文件".在这些情况下,我们需要缩小文件计数. (2认同)

swa*_*ter 30

正如几位人士已经提到的:node_modules目录中的所有文件(包的NPM位置)都是项目依赖项的一部分(所谓的直接依赖项).除此之外,您的依赖项还可以拥有自己的依赖项等等(所谓的传递依赖项).几万个文件没什么特别的.

因为你只能上传10'000个文件(见评论),所以我会选择捆绑引擎.该引擎将捆绑您的所有JavaScript,CSS,HTML等,并创建一个捆绑包(如果您指定它们,则创建更多捆绑包).您的index.html将加载此捆绑包,就是这样.

我是webpack的粉丝,所以我的webpack解决方案将创建一个应用程序包和一个供应商包(对于完整的工作应用程序,请参见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>
Run Code Online (Sandbox Code Playgroud)

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));
}
Run Code Online (Sandbox Code Playgroud)

好处:

  • 完整的生产线(TS linting,compiling,minification等)
  • 3个文件用于部署 - >只有几个Http请求

缺点:

  • 更高的构建时间
  • 不是Http 2项目的最佳解决方案(见免责声明)

免责声明:这是Http 1.*的一个很好的解决方案,因为它可以最大限度地减少每个Http请求的开销.您只有index.html和每个包的请求 - 但不是100 - 200个文件.目前,这是要走的路.

另一方面,Http 2试图最小化Http开销,因此它基于流协议.此流能够双向通信(客户端< - >服务器),并且可以实现更智能的资源加载(您只加载所需的文件).该流消除了大部分Http开销(Less Http往返).

但它与IPv6相同:人们将真正使用Http 2需要几年的时间

  • @mdentinho 是的,在更现代的版本中。但是在 2016 年 SystemJS 和 CLI 是要走的路(很高兴我们现在有了 webpack) (2认同)

Bro*_*cco 21

您需要确保只是部署Angular CLI生成的项目中的dist(可分发的简称)文件夹.这允许该工具获取源代码及其依赖项,并且只为您提供运行应用程序所需的内容.

话虽如此,Angular CLI在生成构建方面存在问题,通过`ng build --prod

昨天(2016年8月2日)发布了一个版本,它将构建机制从西兰花 + systemjs切换到成功处理生产构建的webpack.

基于以下步骤:

ng new test-project
ng build --prod
Run Code Online (Sandbox Code Playgroud)

我看到这里列出的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
Run Code Online (Sandbox Code Playgroud)

注意目前要安装angular cli的webpack版本,你必须运行...npm install angular-cli@webpack -g


Yak*_*ain 14

Angular本身有很多依赖项,CLI的beta版下载的文件数量是其四倍.

这是如何创建一个简单的项目将减少文件("只"10K文件) https://yakovfain.com/2016/05/06/starting-an-angular-2-rc-1-project/


mag*_*guy 13

最近使用 angular cli 创建了一个新项目,并且 node_modules 文件夹是 270 mb,所以是的,这是正常的,但我确信大多数新开发人员对 angular 世界都有疑问并且是有效的。对于一个简单的新项目,将依赖项减少一点可能是有意义的;) 不知道所有包所依赖的内容可能有点令人不安,尤其是对于第一次尝试 cli 的新开发人员。此外,大多数基本教程都没有讨论部署设置以获取仅需要的导出文件。我什至不相信 angular 官方网站上提供的教程讨论如何部署简单的项目。

看起来 node_modules 文件夹是罪魁祸首


Pet*_*sen 12

似乎没有人提到过如下所述的Ahead-of-Time Compilation:https://angular.io/docs/ts/latest/cookbook/aot-compiler.html

到目前为止,我对Angular的体验是,AoT创建了最小的构建,几乎没有加载时间.最重要的是这里的问题是 - 您只需要将一些文件发送到生产中.

这似乎是因为Angular编译器不会随生产版本一起提供,因为模板是"提前"编译的.将HTML模板标记转换为javascript指令也非常酷,这些指令很难在原始HTML中进行逆向工程.

我制作了一个简单的视频,其中我展示了开发版与AoT版本中的Angular应用程序的下载大小,文件数量等 - 您可以在此处看到:

https://youtu.be/ZoZDCgQwnmQ

你会在这里找到演示的源代码:

https://github.com/fintechneo/angular2-templates

并且 - 正如所有其他人所说的那样 - 当您的开发环境中有许多文件时,没有任何错误.这就是Angular和许多其他现代框架所带来的所有依赖关系.但这里的区别在于,当运送到生产时,您应该能够将其打包成几个文件.此外,您不希望git存储库中包含所有这些依赖项文件.


Ang*_*ity 8

这实际上不是Angular特有的,几乎任何使用NodeJs/npm生态系统进行工具的项目都会发生这种情况.

这些项目位于node_modules文件夹中,并且是您的直接依赖项需要运行的过渡依赖项.

在节点生态系统中,模块通常很小,这意味着我们不是自己开发东西,而是倾向于以模块的形式导入我们需要的大部分内容.这可以包括像着名的左键功能这样的小东西,为什么不写作练习呢?

因此,拥有大量文件实际上是一件好事,这意味着一切都非常模块化,模块作者经常重复使用其他模块.这种模块化的简易性可能是节点生态系统增长如此之快的主要原因之一.

原则上这不应该导致任何问题,但似乎你遇到谷歌应用程序引擎文件计数限制.在我的情况下,我建议不要将node_modules上传到app引擎.

而是在本地构建应用程序并上传到谷歌应用程序引擎只有捆绑的文件,但不要上传到应用程序引擎本身.


Jal*_*Oza 8

如果您使用的是角度cli的较新版本 ng build --prod

它将创建具有较少文件的dist文件夹,并且项目的速度将增加.

此外,您可以使用具有最佳角度cli性能的本地测试 ng serve --prod


Seb*_*ens 5

如果使用Angular CLI,则在创建项目时始终可以使用--minimal标志

ng new name --minimal
Run Code Online (Sandbox Code Playgroud)

我只是用旗帜运行它,它创建了24 600个文件并ng build --prod生成212 KB dist文件夹

因此,如果您的项目中不需要喷泉,或者只是想快速测试一下,我认为这非常有用