গ্রান্টকে বিভিন্ন সেটআপের জন্য সূচক। Html উত্পন্ন করুন


208

আমি গ্রান্টকে আমার ওয়েব অ্যাপের জন্য বিল্ড টুল হিসাবে ব্যবহার করার চেষ্টা করছি।

আমি কমপক্ষে দুটি সেটআপ নিতে চাই:

আই। ডেভলপমেন্ট সেটআপ - স্বতন্ত্রভাবে পৃথক ফাইল থেকে স্ক্রিপ্টগুলি লোড করুন,

সুতরাং আমার সূচক html দেখতে কিছু দেখতে হবে:

<!DOCTYPE html>
<html>
    <head>
        <script src="js/module1.js" />
        <script src="js/module2.js" />
        <script src="js/module3.js" />
        ...
    </head>
    <body></body>
</html>

২। উত্পাদনের সেটআপ - আমার স্ক্রিপ্টগুলি লোড করুন এবং একটি ফাইলে কনটেনেটেড,

সেই অনুসারে সূচিপত্র সহ:

<!DOCTYPE html>
<html>
    <head>
        <script src="js/MyApp-all.min.js" />
    </head>
    <body></body>
</html>

প্রশ্নটি হল, আমি যখন চালাচ্ছি grunt devবা কনফিগারেশনের উপর নির্ভর করে এই সূচকগুলি কীভাবে এই সূচকগুলি তৈরি করতে পারি grunt prod?

অথবা হতে পারে আমি ভুল দিকটি খনন করছি এবং সর্বদা উত্পন্ন করা সহজ MyApp-all.min.jsতবে আমার ভিতরে থাকা সমস্ত স্ক্রিপ্টগুলি (কনটেনেটেড) বা একটি লোডার স্ক্রিপ্ট যা এই স্ক্রিপ্টগুলি আলাদা ফাইল থেকে অবিচ্ছিন্নভাবে লোড করে?

ছেলেরা, কীভাবে তুমি এটা করো?


3
ইয়েমেন সরঞ্জামটি ব্যবহার করে দেখুন, যার মধ্যে একটি 'ইউজমিন' টাস্ক রয়েছে যা আপনার মতো করে। তদ্ব্যতীত, ইয়ামন জেনারেটরগুলিতে অনেকগুলি "ভাল অভ্যাস" শেখার জন্য সহজ অন্তর্ভুক্ত থাকে যা কোনও নতুন সরঞ্জাম ব্যবহার করার সময় শেখা শক্ত।
এরিকসোনারন

উত্তর:


161

আমি সম্প্রতি এই গ্রান্ট v0.4.0সামঞ্জস্যপূর্ণ কাজগুলি আবিষ্কার করেছি :

  • ঘোঁৎ ঘোঁৎ-preprocess

    প্রিপ্রোসেস এনপিএম মডিউলের চারপাশে গ্রান্ট টাস্ক

  • ঘোঁৎ ঘোঁৎ-env

    ভবিষ্যতের কাজের জন্য পরিবেশ কনফিগারেশন স্বয়ংক্রিয় করার জন্য গ্রান্ট টাস্ক।

নীচে আমার থেকে স্নিপেট আছে Gruntfile.js

ENV সেটআপ:

env : {

    options : {

        /* Shared Options Hash */
        //globalOption : 'foo'

    },

    dev: {

        NODE_ENV : 'DEVELOPMENT'

    },

    prod : {

        NODE_ENV : 'PRODUCTION'

    }

},

Preprocess:

preprocess : {

    dev : {

        src : './src/tmpl/index.html',
        dest : './dev/index.html'

    },

    prod : {

        src : './src/tmpl/index.html',
        dest : '../<%= pkg.version %>/<%= now %>/<%= ver %>/index.html',
        options : {

            context : {
                name : '<%= pkg.name %>',
                version : '<%= pkg.version %>',
                now : '<%= now %>',
                ver : '<%= ver %>'
            }

        }

    }

}

কাজ:

grunt.registerTask('default', ['jshint']);

grunt.registerTask('dev', ['jshint', 'env:dev', 'clean:dev', 'preprocess:dev']);

grunt.registerTask('prod', ['jshint', 'env:prod', 'clean:prod', 'uglify:prod', 'cssmin:prod', 'copy:prod', 'preprocess:prod']);

এবং /src/tmpl/index.htmlটেমপ্লেট ফাইলে (উদাহরণস্বরূপ):

<!-- @if NODE_ENV == 'DEVELOPMENT' -->

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>
    <script src="../src/js/foo1.js"></script>
    <script src="../src/js/foo2.js"></script>
    <script src="../src/js/jquery.blah.js"></script>
    <script src="../src/js/jquery.billy.js"></script>
    <script src="../src/js/jquery.jenkins.js"></script>

<!-- @endif -->

<!-- @if NODE_ENV == 'PRODUCTION' -->

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

    <script src="http://cdn.foo.com/<!-- @echo name -->/<!-- @echo version -->/<!-- @echo now -->/<!-- @echo ver -->/js/<!-- @echo name -->.min.js"></script>

<!-- @endif -->

আমি নিশ্চিত যে আমার সেটআপ বেশিরভাগ লোকের চেয়ে আলাদা এবং উপরের উপযোগিতা আপনার পরিস্থিতির উপর নির্ভর করবে। আমার জন্য, যদিও এটি কোডের দুর্দান্ত একটি বিট, ইয়েমেন গ্রান্ট-ইউজমিন আমার ব্যক্তিগতভাবে প্রয়োজনের চেয়ে বেশি শক্তিশালী।

উল্লেখ্য: আমি শুধু আজই উপরে তালিকাভুক্ত কাজগুলো আবিষ্কৃত তাই আমি একটি বৈশিষ্ট্য অনুপস্থিত করা যেতে পারে এবং / অথবা আমার প্রক্রিয়া রাস্তায় পরিবর্তন হতে পারে। আপাতত, আমি সরলতা এবং বৈশিষ্ট্যগুলিকে পছন্দ করছি যা গ্রান্ট-প্রিপ্রোসেস এবং গ্রান্ট-এনভি অফার করে। :)


জানুয়ারী 2014 আপডেট:

ডাউন ভোট দ্বারা প্রেরণা ...

যখন আমি এই উত্তরটি পোস্ট করেছি গ্রান্টের পক্ষে 0.4.xএমন অনেকগুলি বিকল্প ছিল না যা আমার প্রয়োজনের জন্য কাজ করে এমন একটি সমাধান দেয়। এখন, কয়েক মাস পরে, আমি অনুমান করব যে এখানে আরও অনেক বিকল্প রয়েছে যা আমি এখানে পোস্ট করেছি তার চেয়ে ভাল হতে পারে। যদিও আমি এখনও ব্যক্তিগতভাবে আমার বিল্ডগুলির জন্য এই কৌশলটি ব্যবহার করি এবং ব্যবহার করে উপভোগ করি , আমি ভবিষ্যতের পাঠকগণকে প্রদত্ত অন্যান্য উত্তরগুলি পড়তে এবং সমস্ত বিকল্পগুলি নিয়ে গবেষণা করার জন্য সময় নিতে অনুরোধ করি। আপনি যদি আরও ভাল সমাধান খুঁজে পান তবে দয়া করে আপনার উত্তর এখানে পোস্ট করুন।

ফেব্রুয়ারী 2014 আপডেট:

এটি কারওর উপকারে আসবে কিনা তা আমি নিশ্চিত নই, তবে আমি গিটহাবের উপরে এই ডেমো সংগ্রহস্থলটি তৈরি করেছি যা উপরে বর্ণিত কৌশলগুলি ব্যবহার করে একটি সম্পূর্ণ (এবং আরও জটিল সেটআপ) দেখায়।


ধন্যবাদ, আমি এটি পরীক্ষা করে দেখব!
দিমিত্রি পশকেভিচ 20'13

3
আপনার সমাধানটি আমাকে দেয়ালের বিরুদ্ধে মাথা ঘোরানোর কয়েক ঘন্টা বাঁচিয়েছিল। ধন্যবাদ।
sthomps

1
@ স্টাম্পস এটি সাহায্য করে খুশি! যখনই আমি এই কাজগুলি আবিষ্কার করেছি, তখন থেকেই আমি কাজের প্রবাহকে ভালবাসি। এফওয়াইআই, আমি প্রক্রিয়াটিতে একটি সামান্য পরিবর্তন করেছি ... আমার এইচটিএমএল টেমপ্লেটগুলিতে বেশ কয়েকটি প্রসঙ্গের পরিবর্তনগুলি পাস করার পরিবর্তে, আমি একটি ভার পাস করেছিলাম path : '/<%= pkg.name %>/dist/<%= pkg.version %>/<%= now %>/<%= ver %>'যা সমস্ত ভার্সেটগুলি (এটিই আমার নির্মাণের পথ) কে যুক্ত করে। আমার টেমপ্লেটের আমি থাকবে না: <script src="http://cdn.foo.com<!-- @echo path -->/js/bulldog.min.js"></script>। যাইহোক, আমি খুশি যে আমি আপনাকে কিছু সময় বাঁচাতে সক্ষম হয়েছি! : ডি
mululse

4
আপনি কেবল গ্রান্ট-টেম্পলেট ব্যবহার করে একই জিনিসটি করতে পারেন , কেবল dataডিভ / প্রোডের জন্য আলাদা কোনও বস্তুর মধ্যে দিয়ে ।
ম্যাথিয়াস বাইনেস

2
মানুষ আমি এই সমাধানটি পছন্দ করি .. এটি পরিষ্কার, পঠনযোগ্য এবং বেশি ইঞ্জিনিয়ারড নয়।
গৌরাঙ্গ প্যাটেল

34

আমি আমার নিজের সমাধান নিয়ে এসেছি। এখনও পালিশ করা হয়নি তবে আমি মনে করি আমি সেই দিকে এগিয়ে চলেছি।

মূলত, আমি বর্তমান কনফিগারেশন বিশ্লেষণ করে এবং আমার মূল উত্স ফাইলগুলির একটি তালিকা তৈরি করে বা মিনিফাইড কোড সহ একটি একক ফাইলের লিঙ্ক তৈরি করে এমন একটি টেম্পলেট থেকে আমার উত্পন্ন করতে গ্রান্ট.টেম্পলেট.প্রসেস () ব্যবহার করছি index.html। নীচের উদাহরণটি জেএস ফাইলগুলির জন্য তবে একই পদ্ধতিটি সিএসএস এবং অন্য কোনও সম্ভাব্য পাঠ্য ফাইলগুলিতে বাড়ানো যেতে পারে।

grunt.js:

/*global module:false*/
module.exports = function(grunt) {
    var   // js files
        jsFiles = [
              'src/module1.js',
              'src/module2.js',
              'src/module3.js',
              'src/awesome.js'
            ];

    // Import custom tasks (see index task below)
    grunt.loadTasks( "build/tasks" );

    // Project configuration.
    grunt.initConfig({
      pkg: '<json:package.json>',
      meta: {
        banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
          '<%= grunt.template.today("yyyy-mm-dd") %> */'
      },

      jsFiles: jsFiles,

      // file name for concatenated js
      concatJsFile: '<%= pkg.name %>-all.js',

      // file name for concatenated & minified js
      concatJsMinFile: '<%= pkg.name %>-all.min.js',

      concat: {
        dist: {
            src: ['<banner:meta.banner>'].concat(jsFiles),
            dest: 'dist/<%= concatJsFile %>'
        }
      },
      min: {
        dist: {
        src: ['<banner:meta.banner>', '<config:concat.dist.dest>'],
        dest: 'dist/<%= concatJsMinFile %>'
        }
      },
      lint: {
        files: ['grunt.js'].concat(jsFiles)
      },
      // options for index.html builder task
      index: {
        src: 'index.tmpl',  // source template file
        dest: 'index.html'  // destination file (usually index.html)
      }
    });


    // Development setup
    grunt.registerTask('dev', 'Development build', function() {
        // set some global flags that all tasks can access
        grunt.config('isDebug', true);
        grunt.config('isConcat', false);
        grunt.config('isMin', false);

        // run tasks
        grunt.task.run('lint index');
    });

    // Production setup
    grunt.registerTask('prod', 'Production build', function() {
        // set some global flags that all tasks can access
        grunt.config('isDebug', false);
        grunt.config('isConcat', true);
        grunt.config('isMin', true);

        // run tasks
        grunt.task.run('lint concat min index');
    });

    // Default task
    grunt.registerTask('default', 'dev');
};

index.js (the index task):

module.exports = function( grunt ) {
    grunt.registerTask( "index", "Generate index.html depending on configuration", function() {
        var conf = grunt.config('index'),
            tmpl = grunt.file.read(conf.src);

        grunt.file.write(conf.dest, grunt.template.process(tmpl));

        grunt.log.writeln('Generated \'' + conf.dest + '\' from \'' + conf.src + '\'');
    });
}

অবশেষে, index.tmplপ্রজন্মের যুক্তিগুলি বেকড সহ:

<doctype html>
<head>
<%
    var jsFiles = grunt.config('jsFiles'),
        isConcat = grunt.config('isConcat');

    if(isConcat) {
        print('<script type="text/javascript" src="' + grunt.config('concat.dist.dest') + '"></script>\n');
    } else {
        for(var i = 0, len = jsFiles.length; i < len; i++) {
            print('<script type="text/javascript" src="' + jsFiles[i] + '"></script>\n');
        }
    }
%>
</head>
<html>
</html>

UPD। জানতে পেরেছি যে ইওমান , যা গ্রুর্টের উপর ভিত্তি করে তৈরি হয়েছে, একটি অন্তর্নির্মিত ইউজমিন টাস্ক রয়েছে যা ইওমানের বিল্ড সিস্টেমের সাথে সংহত করে। এটি সূচিপত্রের HTML সংস্করণ ও অন্যান্য পরিবেশের সেটিংসের বিকাশ সংস্করণ সম্পর্কিত তথ্য থেকে সূচকগুলির একটি উত্পাদন সংস্করণ উত্পন্ন করে gene কিছুটা পরিশীলিত তবে দেখতে আকর্ষণীয়।


5
গ্রান্ট-টেম্পলেট চারপাশে খুব হালকা ওজনের একটি মোড়কgrunt.template.process()(যা আপনি এখানে ব্যবহার করছেন) যা এটি আরও সহজ করে তুলবে। আপনি কেবল একইভাবেদেব / প্রোডের জন্যআলাদাকোনও বস্তুরমধ্যে দিয়ে গ্রান্ট-টেম্পলেট ব্যবহার করে তা করতে পারেনdata
ম্যাথিয়াস বাইনেন্স

15

আমি এখানে সমাধানগুলি অপছন্দ করি ( আমি আগে দিয়েছিলাম তার একটি সহ ) এবং এখানে কেন:

  • সর্বাধিক ভোট দেওয়া উত্তরের সমস্যাটি হ'ল আপনি যখন কোনও জেএস ফাইল যুক্ত / পুনর্নবীকরণ / মুছবেন তখন আপনাকে স্ক্রিপ্ট ট্যাগগুলির তালিকা ম্যানুয়ালি সিঙ্ক করতে হবে।
  • গৃহীত উত্তরের সমস্যাটি হ'ল আপনার জেএস ফাইলগুলির তালিকায় প্যাটার্ন মেলানো যাবে না। এর অর্থ আপনি গ্রান্টফাইলে হাত দিয়ে এটি আপডেট করবেন।

আমি এই দু'টি সমস্যার সমাধান কীভাবে করব তা বুঝতে পেরেছি। আমি আমার গুরুতর কাজটি সেট আপ করেছি যাতে প্রতিবার কোনও ফাইল যুক্ত করা বা মুছতে গেলে স্ক্রিপ্ট ট্যাগগুলি প্রতিফলিত হওয়ার জন্য স্বয়ংক্রিয়ভাবে উত্পন্ন হয়। এই ভাবে, আপনি আপনার HTML ফাইল অথবা আপনার ঘোঁৎ ঘোঁৎ ফাইল পরিবর্তন করার প্রয়োজন হবে না যখন আপনি যোগ / অপসারণ / নামান্তর আপনার জাতীয় ফাইল।

কীভাবে এটি কাজ করে তা সংক্ষেপে, আমার কাছে স্ক্রিপ্ট ট্যাগগুলির জন্য একটি ভেরিয়েবল সহ একটি এইচটিএমএল টেমপ্লেট রয়েছে। আমি এই ভেরিয়েবলটি জনিত করতে https://github.com/alanshaw/grunt-incolve-replace ব্যবহার করি । ডেভ মোডে, সেই পরিবর্তনশীলটি আমার সমস্ত জেএস ফাইলগুলির গ্লোব্বিং প্যাটার্ন থেকে আসে। যখন কোনও জেএস ফাইল যুক্ত বা সরানো হয় তখন ওয়াচ টাস্কটি এই মানটিকে পুনরায় গণনা করে।

এখন, দেব বা প্রোড মোডে বিভিন্ন ফলাফল পেতে, আপনি কেবল সেই ভেরিয়েবলটিকে একটি পৃথক মান দিয়ে বসান। এখানে কিছু কোড রয়েছে:

var jsSrcFileArray = [
    'src/main/scripts/app/js/Constants.js',
    'src/main/scripts/app/js/Random.js',
    'src/main/scripts/app/js/Vector.js',
    'src/main/scripts/app/js/scripts.js',
    'src/main/scripts/app/js/StatsData.js',
    'src/main/scripts/app/js/Dialog.js',
    'src/main/scripts/app/**/*.js',
    '!src/main/scripts/app/js/AuditingReport.js'
];

var jsScriptTags = function (srcPattern, destPath) {
    if (srcPattern === undefined) {
        throw new Error("srcPattern undefined");
    }
    if (destPath === undefined) {
        throw new Error("destPath undefined");
    }
    return grunt.util._.reduce(
        grunt.file.expandMapping(srcPattern, destPath, {
            filter: 'isFile',
            flatten: true,
            expand: true,
            cwd: '.'
        }),
        function (sum, file) {
            return sum + '\n<script src="' + file.dest + '" type="text/javascript"></script>';
        },
        ''
    );
};

...

grunt.initConfig({

    includereplace: {
        dev: {
            options: {
                globals: {
                    scriptsTags: '<%= jsScriptTags(jsSrcFileArray, "../../main/scripts/app/js")%>'
                }
            },
            src: [
                'src/**/html-template.html'
            ],
            dest: 'src/main/generated/',
            flatten: true,
            cwd: '.',
            expand: true
        },
        prod: {
            options: {
                globals: {
                    scriptsTags: '<script src="app.min.js" type="text/javascript"></script>'
                }
            },
            src: [
                'src/**/html-template.html'
            ],
            dest: 'src/main/generatedprod/',
            flatten: true,
            cwd: '.',
            expand: true
        }

...

    jsScriptTags: jsScriptTags

jsSrcFileArrayএটি আপনার সাধারণ গ্রাউন্ট ফাইল-গ্লোব্বিং নিদর্শন। jsScriptTagsগ্রহণ করে jsSrcFileArrayএবং scriptউভয় পক্ষের ট্যাগগুলির সাথে একত্রিত করে। destPathপ্রতিটি ফাইলে আমি চাই উপসর্গ।

এইচটিএমএল দেখতে দেখতে এখানে কি:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Example</title>

</head>

<body>    
@@scriptsTags
</body>
</html>

এখন, আপনি কনফিগারেশনে দেখতে পাচ্ছেন, মোডে scriptচলাকালীন আমি হার্ড কোডিং ট্যাগ হিসাবে সেই ভেরিয়েবলের মান উত্পন্ন করি prod। ডেভ মোডে, এই ভেরিয়েবলটি এর মতো একটি মানটিতে প্রসারিত হবে:

<script src="../../main/scripts/app/js/Constants.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/Random.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/Vector.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/StatsData.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/Dialog.js" type="text/javascript"></script>

যদি আপনার কোন প্রশ্ন থাকে তাহলে আমার জানতে দিন।

PS: প্রতিটি ক্লায়েন্ট-সাইড জেএস অ্যাপ্লিকেশনটিতে আমি যা করতে চাই তার জন্য এটি কোডের এক ক্রেজি পরিমাণ। আমি আশা করি কেউ এটিকে পুনরায় ব্যবহারযোগ্য প্লাগইনে রূপান্তর করতে পারে। হয়ত আমি কিছুদিন করব।


1
প্রতিশ্রুতিশীল শোনাচ্ছে. কোনও সুযোগ আপনি কিছু স্নিপকেট শেয়ার করতে পারেন?
অ্যাডাম মার্শাল

I've set up my grunt task so that every time a file is added or deleted, the script tags automatically get generated to reflect thatআপনি এটা কিভাবে করেছিলেন?
কোডি বাগস্টাইন

2
অন্য প্রশ্ন: আপনি কি এইচটিএমএল <script>ট্যাগগুলির ব্লক মুছতে চান ?
কোডি বাগস্টিন

@ ইম্রাই আমার মাথার উপরের অংশ থেকে সরে নেই। আপনার অর্থ কোনও প্রকার টেম্প্লেটিং ছাড়াই (উদাহরণস্বরূপ গ্রান্ট-অন্তর্ভুক্ত-প্রতিস্থাপন)? প্রথম চিন্তা যে আমার মাথার মধ্যে পপগুলি xslt হবে। সম্ভবত একটি ভাল সমাধান না, যদিও।
ড্যানিয়েল ক্যাপলান

1
এই উত্তরটি, উপর স্পট যদিও আমি ব্যক্তিগতভাবে মুছে ফেলা হবে destPathথেকে jsScriptTagsএবং অদলবদল grunt.file.expandMappingসঙ্গে grunt.file.expandযেমন ফাইল আমি চেয়েছিলেন সঠিক স্থানে ইতিমধ্যে ছিল। এই সরলীকৃত জিনিস অনেক। আপনাকে @ ড্যানিয়েলক্যাপলানকে ধন্যবাদ, আপনি আমাকে একটি বিশাল পরিমাণ সময় সাশ্রয় করেছেন :)
ড্যানিয়েল এম

13

আমি কিছুক্ষণের জন্য নিজেকে একই প্রশ্ন করে আসছি এবং আমি মনে করি যে এই গ্রান্ট প্লাগইনটি আপনি যা চান তা করতে কনফিগার করা যায়: https://npmjs.org/package/grunt-targethtml । এটি শর্তযুক্ত এইচটিএমএল ট্যাগ প্রয়োগ করে, যা গ্রান্ট টার্গেটের উপর নির্ভর করে।


2
আমি এই প্লাগইনটি দেখেছি তবে আমার সূচক html এ সমস্ত ফাইল (এবং আসলে কোনও যুক্তিযুক্ত) ম্যানুয়ালি উল্লেখ করার ধারণাটি পছন্দ করি না কারণ আমার গ্রান্ট কনফিগারেশনে ইতিমধ্যে সোর্স জেএস / সিএসএস ফাইলগুলির একটি তালিকা রয়েছে এবং ডন ' নিজেকে পুনরাবৃত্তি করতে চাই না। নীচের লাইনটি হ'ল - এটি সূচিপত্রের মধ্যে নেই html যেখানে কোন ফাইলগুলি অন্তর্ভুক্ত করবেন তা আপনার সিদ্ধান্ত নেওয়া উচিত
দিমিত্রি পশকভিচ

গ্রান্ট-টার্গেটটিএমএল জন্য +1। যদিও আপনার ইনডেক্স.ইচটিএমএলে বিবৃতিগুলি "সিদ্ধান্ত" দিতে গেলে কোন সম্পদ লোড করতে হবে তা যুক্ত করতে কিছুটা কুৎসিত। তবুও, এটা বোঝা যায় না। আপনার প্রকল্পের সংস্থানগুলি সাধারণত আপনি অন্তর্ভুক্ত করার জন্য দেখতে পাবেন। এছাড়াও, এগুলি অনুসরণ করে আমাকে গ্রান্ট-অবদান চেক করতে পরিচালিত করে। এটিতে কিছু দুর্দান্ত জিনিস রয়েছে।
carbontax

8

আমি আরও সহজ, সোজা এগিয়ে সমাধানের সন্ধান করছিলাম তাই আমি এই প্রশ্নের উত্তরটি একত্রিত করেছিলাম:

গ্রান্টফিল.জেএস এ অন্য কোনও ব্লক থাকলে কীভাবে রাখবেন

এবং নিম্নলিখিত সহজ পদক্ষেপগুলি নিয়ে আসে:

  1. তালিকাভুক্ত হওয়ার সাথে সাথে আপনার সূচী ফাইলগুলির দুটি সংস্করণ রাখুন এবং তাদের সূচি-বিকাশ html এবং সূচি-প্রোডোকশন html নাম দিন।
  2. আপনার সূচিপত্র HTML ফাইলের জন্য আপনার গ্রান্টফিল.জেএস এর কনক্যাট / কপি ব্লকে নিম্নলিখিত যুক্তি ব্যবহার করুন:

    concat: {
        index: {
            src : [ (function() {
                if (grunt.option('Release')) {
                  return 'views/index-production.html';
                } else {
                  return 'views/index-development.html';
                }
              }()) ],
           dest: '<%= distdir %>/index.html',
           ...
        },
        ...
    },
  3. সূচক-প্রযোজনা html ফাইলটি চয়ন করতে 'গ্রান্ট - রিলিজ' চালান এবং উন্নয়নের সংস্করণটি রাখার জন্য পতাকাটি ছেড়ে যান।

যুক্ত বা কনফিগার করার জন্য কোনও নতুন প্লাগইন নেই এবং কোনও নতুন গুরুতর কার্য নেই।


3
এখানে কেবলমাত্র খারাপ দিকটি বজায় রাখার জন্য দুটি সূচক। Html ফাইল রয়েছে।
অ্যাডাম মার্শাল

5

স্ক্রিপ্টলিঙ্কার নামের এই ভয়াবহ কাজটি দেব মোডে স্ক্রিপ্টগুলি যুক্ত করার একটি সহজ পদ্ধতির মতো দেখায়। আপনি সম্ভবত প্রথমে একটি কনক্যাট টাস্কটি চালাতে পারেন এবং তারপরে প্রোড মোডে এটি আপনার কনক্যাটেনেটেড ফাইলের দিকে নির্দেশ করতে পারেন।


+1 টি। ডকুমেন্টেশন বিভ্রান্তিকর এবং কিছু স্টাফ (অ্যাপ্ল রুট, আপেক্ষিক) সর্বদা উদ্দিষ্ট হিসাবে কাজ করে না, তবে এখনও: সহায়ক সরঞ্জাম।
হ্যাশচেঞ্জ

1
@ হ্যাশচেঞ্জ আমি এই সরঞ্জামটি ব্যবহার করি না। আমি এর পরিবর্তে github.com/alanshaw/grunt-incolve-replace ব্যবহার করে শেষ করেছি । আমার এইচটিএমএল ফাইলটিতে আমার একটি পরিবর্তনশীল রয়েছে স্ক্রিপ্ট ট্যাগগুলি উপস্থাপন করে। তারপরে আমি এই ভেরিয়েবলটি এইচটিএমএল-এর একটি স্ট্রিং দিয়ে পপুলেট করব। দেব মোডে, এই পরিবর্তনশীলটি স্ক্রিপ্টগুলির একটি তালিকা a প্রোড মোডে এই পরিবর্তনশীলটি হ'ল সংক্ষিপ্ত, ক্ষুদ্রতর সংস্করণ।
ড্যানিয়েল ক্যাপলান

সঙ্কুচিত-অন্তর্ভুক্ত-প্রতিস্থাপন পয়েন্টার জন্য ধন্যবাদ। (একটি মোচা ইনডেক্স.ইচটিএমএল ফাইলের জন্য ডিরেক্টরিতে সমস্ত স্পেক ফাইল যুক্ত করার জন্য আমার আসলে একটি সরঞ্জামের দরকার ছিল Script স্ক্রিপ্টলিঙ্কার এটির জন্য ভাল))
হ্যাশচ্যাচ

ডকুমেন্টেশন চুষার বিষয়ে আপনি ঠিকই বলেছেন আপনার এইচটিএমএল ফাইলটিতে স্ক্রিপ্টের টাইলগুলি কোথায় রাখবেন তা আপনি কীভাবে বলবেন ?
ড্যানিয়েল ক্যাপলান

1
আপনি একটি এইচটিএমএল মন্তব্য সংজ্ঞায়িত করুন। কটাক্ষপাত আছে এই ফাইলটি । সন্নিবেশ <!--SINON COMPONENT SCRIPTS-->এবং এগুলি ঘটে <!--SPEC SCRIPTS-->। এবং এখানে গ্রান্ট টাস্কটি এটি করে (প্রকৃত কার্যকারী একটি, ডক্সের স্টাফের বিপরীতে)। আশা করি এটি সাহায্য করে;)
20'40 এ হ্যাশচেঞ্জ

5

ঘোঁৎ ঘোঁৎ-Dom-মুঙ্গের সিএসএস নির্বাচনকারীদের সাথে এইচটিএমএল পড়ে এবং পরিচালনা করে। যাত্রা। আপনার এইচটিএমএল থেকে ট্যাগ পড়ুন। নোডগুলি সরান, নোড যোগ করুন এবং আরও অনেক কিছু।

আপনার সূচক html দ্বারা সংযুক্ত আপনার সমস্ত জেএস ফাইলগুলি পড়ার জন্য আপনি গ্রান্ট-ডম-মুনজারটি ব্যবহার করতে পারেন, সেগুলি uglif করুন এবং তারপরে কেবল সূক্ষ্ম জেএসকে লিঙ্ক করতে আপনার সূচি html পরিবর্তন করতে আবার গ্রান্ট-ডম-মুঙ্গার ব্যবহার করতে পারেন


5

গ্রান্ট-ডেভ-প্রোড-স্যুইচ নামে একটি গ্রান্ট প্লাগইন পেয়েছি। এটি সমস্ত কিছু হ'ল এমন কিছু ব্লককে মন্তব্য করে যা আপনি - ইউএনভি বিকল্পের উপর নির্ভর করে যা গ্রান্টে পাস করেন (যদিও এটি আপনাকে দেব, প্রোড এবং পরীক্ষায় সীমাবদ্ধ করে) on

একবার আপনি এখানে এটির বর্ণনা হিসাবে সেট আপ করলে আপনি উদাহরণস্বরূপ চালাতে পারেন:

grunt serve --env=dev, এবং এটি যা করে তা হ'ল যে ব্লকগুলি মোড়ানো রয়েছে তার মন্তব্যগুলি

    <!-- env:test/prod -->
    your code here
    <!-- env:test/prod:end -->

এবং এটি মুছে ফেলা যা ব্লকগুলি uncomment হবে

    <!-- env:dev -->
    your code here
    <!-- env:dev:end -->

এটি জাভাস্ক্রিপ্টেও কাজ করে, আমি আমার ব্যাকএন্ড এপিআইয়ের সাথে সংযোগ রাখতে সঠিক আইপি ঠিকানা স্থাপনের জন্য এটি ব্যবহার করি। ব্লকগুলি কেবল পরিবর্তিত হয়

    /* env:dev */
    your code here
    /* env:dev:end */

আপনার ক্ষেত্রে এটি এতটা সহজ হবে:

<!DOCTYPE html>
<html>
    <head>
        <!-- env:dev -->
        <script src="js/module1.js" />
        <script src="js/module2.js" />
        <script src="js/module3.js" />
        ...
        <!-- env:dev:end -->
        <!-- env:prod -->
        <script src="js/MyApp-all.min.js" />
        ...
        <!-- env:prod:end -->
    </head>
    <body></body>
</html>

4

গ্রান্ট-বেক একটি দুর্দান্ত গ্রুর্ট স্ক্রিপ্ট যা এখানে দুর্দান্ত কাজ করবে। আমি এটি আমার জিকিউএম অটো বিল্ড স্ক্রিপ্টে ব্যবহার করি।

https://github.com/imaginethepoet/autojqmphonegap

আমার গ্রান্ট কফি ফাইলটি একবার দেখুন:

bake:
    resources: 
      files: "index.html":"resources/custom/components/base.html"

এটি বেস html- এ থাকা সমস্ত ফাইলের দিকে নজর রাখে এবং সূচি তৈরি করতে তাদের সফলভাবে ডেকে আনে html মাল্টিপেজ অ্যাপ্লিকেশনগুলির জন্য দুর্দান্ত কাজ করে (ফোনগ্যাপ)। এটি আরও সহজ বিকাশের অনুমতি দেয় কারণ সমস্ত ডেভস একটি দীর্ঘ একক পৃষ্ঠার অ্যাপ্লিকেশনটিতে কাজ করে না (প্রচুর সংঘাতের চেকইন প্রতিরোধ করে)। পরিবর্তে আপনি পৃষ্ঠাগুলি ভাঙ্গতে এবং কোডের ছোট অংশগুলিতে কাজ করতে এবং একটি ওয়াচ কমান্ড ব্যবহার করে পুরো পৃষ্ঠাতে সংকলন করতে পারেন।

বেক বেস টু টেমপ্লেটটি টেমপ্লেটটি পড়ে এবং ঘড়ির অংশে এইচটিএমএল পৃষ্ঠাগুলি ইনজেক্ট করে।

<!DOCTYPE html>

jQuery মোবাইল ডেমোস

app.initialize ();

<body>
    <!--(bake /resources/custom/components/page1.html)-->
    <!--(bake /resources/custom/components/page2.html)-->
    <!--(bake /resources/custom/components/page3.html)-->
</body>

আপনি এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে পারেন এবং "মেনুগুলি" "পপআপস" ইত্যাদির জন্য আপনার পৃষ্ঠাগুলিতে ইনজেকশন যুক্ত করতে পারেন যাতে আপনি পৃষ্ঠাগুলিকে আরও ছোট পরিচালনাযোগ্য উপাদানগুলিতে ভেঙে ফেলতে পারেন।


গ্রাউন্ট-বেক ব্যবহার করে এমন কোনও কোড ডেমো দিয়ে আপনি নিজের উত্তরটি বাড়িয়ে দিতে পারেন?
দিমিত্রি পশকেভিচ

4

এই কাজের যত্ন নিতে গ্রিডটি ব্যবহার করার জন্য ওয়্যারিডেপ https://github.com/taptapship/wiredep এবং usemin https://github.com/yeoman/grunt-usemin এর সংমিশ্রণটি ব্যবহার করুন । ওয়্যারিডেপ আপনার নির্ভরতাগুলি একবারে একটি স্ক্রিপ্ট ফাইল যুক্ত করবে, এবং ইউজনমিন তাদের সমস্তকে একক ফাইলের জন্য উত্পাদনের জন্য যুক্ত করবে। এটি কেবলমাত্র কিছু HTML মন্তব্য দিয়েই সম্পন্ন করা যায়। উদাহরণস্বরূপ, আমার চালক প্যাকেজগুলি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত হয়ে এইচটিএমএল এ যুক্ত হবে যখন আমি চালাব bower install && grunt bowerInstall:

<!-- build:js /scripts/vendor.js -->
<!-- bower:js -->
<!-- endbower -->
<!-- endbuild -->

2

এই উত্তর noobs জন্য নয়!

জেড টেম্প্লেটিং ব্যবহার করুন ... জেড টেমপ্লেটে ভেরিয়েবলগুলি পাস করা একটি বোগ স্ট্যান্ডার্ড ইউজ কেস

আমি গ্রান্ট (গ্রান্ট-অবদান-জেড) ব্যবহার করছি তবে আপনাকে গ্রান্ট ব্যবহার করতে হবে না। কেবলমাত্র স্ট্যান্ডার্ড এনএমপি জেড মডিউলটি ব্যবহার করুন।

যদি গ্রান্ট ব্যবহার করা হয় তবে আপনার গ্রান্টফাইলে এমন কিছু চাই ...

jade: {
    options: {
      // TODO - Define options here
    },
    dev: {
      options: {
        data: {
          pageTitle: '<%= grunt.file.name %>',
          homePage: '/app',
          liveReloadServer: liveReloadServer,
          cssGruntClassesForHtmlHead: 'grunt-' + '<%= grunt.task.current.target %>'
        },
        pretty: true
      },
      files: [
        {
          expand: true,
          cwd: "src/app",
          src: ["index.jade", "404.jade"],
          dest: "lib/app",
          ext: ".html"
        },
        {
          expand: true,
          flatten: true,
          cwd: "src/app",
          src: ["directives/partials/*.jade"],
          dest: "lib/app/directives/partials",
          ext: ".html"
        }
      ]
    }
  },

জেড টেম্পলেটটিতে আমরা গ্রুর্ট দ্বারা পাস করা ডেটা সহজেই অ্যাক্সেস করতে পারি।

মডার্নিজারের ব্যবহৃত পদ্ধতির মতো, আমি ভেরিয়েবলের মান অনুসারে এইচটিএমএল ট্যাগে একটি সিএসএস ক্লাস সেট করেছিলাম এবং সিএসএস ক্লাস উপস্থিত রয়েছে কি না তার ভিত্তিতে সেখান থেকে জাভাস্ক্রিপ্ট যুক্তি ব্যবহার করতে পারি।

এটি কৌনিকটি ব্যবহার করে দুর্দান্ত হয় যেহেতু আপনি ক্লাস উপস্থিত কিনা তার ভিত্তিতে পৃষ্ঠাটিতে উপাদানগুলি অন্তর্ভুক্ত করতে এনজি-ইফ করতে পারেন।

উদাহরণস্বরূপ, ক্লাসটি উপস্থিত থাকলে আমি কোনও স্ক্রিপ্ট অন্তর্ভুক্ত করতে পারি ...

(উদাহরণস্বরূপ, আমি সরাসরি লাইভ পুনরায়লোড স্ক্রিপ্টটি দেবের মধ্যে অন্তর্ভুক্ত করতে পারি তবে উত্পাদনে নয়)

<script ng-if="controller.isClassPresent()" src="//localhost:35729/livereload.js"></script> 

2

প্রসেসটিটিএমএল বিবেচনা করুন । এটি বিল্ডগুলির জন্য একাধিক "লক্ষ্য" এর সংজ্ঞা দেয়। মন্তব্যগুলি শর্তসাপেক্ষে HTML থেকে উপাদান অন্তর্ভুক্ত করতে বা বাদ দিতে ব্যবহৃত হয়:

<!-- build:js:production js/app.js -->
...
<!-- /build -->

হয়ে

<script src="js/app.js"></script>

এটি এমনকি ভালো ছিমছাম উপাদান কি (দেখুন purports README ):

<!-- build:[class]:dist production -->
<html class="debug_mode">
<!-- /build -->

<!-- class is changed to 'production' only when the 'dist' build is executed -->
<html class="production">
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.