4

バックグラウンド

100 を超える Javascript および HTML テンプレート ファイルを含むプロジェクトを用意します。開発環境からファイルを直接ロードするスクリプト ローダー (yepnope) を使用して、開発プロセス中に小さな変更をファイルに保存し、ブラウザーを更新した後にすぐに表示できるようにします。

問題

これは最初はうまくいきましたが、プロジェクトが大きくなった今、ブラウザがすべてのファイルをロードするのに時間がかかりすぎています。本番環境では、すべてのファイルを連結できますが、開発プロセスを高速化し、開発者のフラストレーションを軽減するために、開発環境も機敏である必要があります。

質問

現在のファイル構成を維持しながら、おそらくファイルを 1 つの大きなファイルとしてブラウザーに配信できる何らかのソリューションを探しています。これがどのように機能するかわかりません。このようなソリューションは、ソース ファイルの変更を検出するたびに、ある種の派生ファイルを更新しますか?それとも、すべてを 1 つの大きなファイルに保持しますが、ディレクトリ構造であるかのように IDE 内でファイルをナビゲートできるようにしますか?

現在、PyCharm を使用しています。

本当にありがとう!

4

2 に答える 2

3

確実にJavaScriptファイルを連結する必要があります。多くのファイルを提供することは、本当に悪いことです。私が今使っているのはGruntです。これは nodejs タスク ランナーです。2つの環境があります

  • development/local - ローカル環境で Grunt はファイルを連結しますが、縮小しません。また、すべてのファイルの上に有益なコメントが追加されるため、DevTools でエラーが表示された場合は、正確なファイルを表示するために少しスクロールする必要があります
  • production - 最終ファイルが縮小され、コメントが削除されます。

このアプローチを使用すると、すべてが異なるファイルに分割されますが、1 つのファイルのみが提供されます。実際には、JavaScript だけでなく、html テンプレート、CSS、キャッシュ マニフェストとメインの index.html ファイルの生成にも Grunt を使用しています。package.json ファイルは次のようになります。

{
  "name": "project",
  "version": "0.0.1",
  "description": "project",
  "repository": {},
  "devDependencies": {
    "grunt": "0.4.1",
    "grunt-contrib-concat": "0.3.0",
    "grunt-contrib-watch": "0.4.4"
  }
}

そして、Gruntfile.js:

module.exports = function(grunt) {

    grunt.initConfig({
        // contcatenation
        concat: {
            // javascript
            js: {
                src: ['src/**/*.js'],
                dest: 'bin/scripts.js',
                options: {
                    process: function(src, filepath) {
                        // do something here
                        return "\n/* " + filepath + " */\n" + src;
                    }
                }
            },
            // CSS
            css: {
                src: ['src/**/*.css'],
                dest: 'bin/styles.css',
                options: {
                    process: function(src, filepath) {
                        return src;
                    }
                }
            },
            // HTML templates
            html: {
                src: ['src/**/*.html', '!src/index.html'],
                dest: 'tmp/templates.html',
                options: {
                    process: function(src, filepath) {
                        return src;                     
                    }
                }
            }
        },
        // custom task for generating index.html (it's a single page app)
        'generate-index': {
            index: {
                src: '<%= concat.html.dest %>',
                dest: 'bin/index.html',
                template: 'src/index.html'
            }
        },
        // custom task for generating cache manifest file
        'generate-manifest': {
            manifest: {
                dest: 'bin/cache.manifest'
            }
        },
        // watching all the files and performa the specific tasks
        watch: {
            js: {
                files: ['<%= concat.js.src[0] %>'],
                tasks: ['concat:js', 'generate-manifest']
            },
            css: {
                files: ['<%= concat.css.src[0] %>'],
                tasks: ['concat:css', 'generate-manifest']
            },
            html: {
                files: ['<%= concat.html.src[0] %>'],
                tasks: ['concat:html', 'generate-index', 'generate-manifest']
            },
            img: {
                files: ['bin/img/**/*.png', 'bin/img/**/*.jpg', 'bin/img/**/*.gif'],
                tasks: ['generate-manifest']    
            }
        }
    });

    // loading modules
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadTasks('tasks');

    // grunt.registerTask('default', ['concat', 'less']);
    grunt.registerTask('default', ['concat', 'generate-index', 'generate-manifest', 'watch']);

}
于 2013-09-17T06:52:08.683 に答える
1

1 つは、JavaScript ソース マップです。これにより、1 つの大きなファイルを、それらがどのように組み合わされているかという情報とともに配信できます。ブラウザがソース マップをサポートしている場合、縮小および結合されていないかのように、縮小および結合されたファイルが表示されます。これを実現するために、ソース マップの情報を使用して元のソース ファイルをロードします。私が見たところ、元のファイルは必要な場合にのみロードされます (スクリプト ビューに表示されます)。

あなたができるもう1つのことはexpire、たとえば1日のヘッダーを使用して、アサートの前にビルド番号を付けることです。コードの変更時にコードが再構築される場合、新しいビルド番号が生成されます。そうすれば、変更が行われたときにのみ js コードがリロードされ、それ以外の場合はブラウザーのキャッシュから読み込まれます。そうすれば、変更後の最初のロードのみが遅くなりますが、テストのためにページは再びスムーズに実行されます。

于 2013-09-17T06:58:35.963 に答える