рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
18 рдлрд░рд╡рд░реА рдХреЛ,
рдЧреНрд░рдВрдЯ v0.4.0 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛
рдерд╛ , рдФрд░ рдореИрдВ рдЗрд╕ рдкрд░ рд╕рднреА рдХреЛ рдмрдзрд╛рдИ рджреЗрддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдЕрднреА рддрдХ рдЧреНрд░рд╛рдВрдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рдПрдВ рдпрд╛
рд╣реИрдмреЗ рдкрд░ рдПрдХ
рддрдереНрдп-рдЦреЛрдЬ рд▓реЗрдЦ рдкрдврд╝реЗрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЧреНрд░рд╛рдВрдЯ рдЖрдкрдХреЛ рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдмреЙрдиреНрдбрд┐рдВрдЧ рдФрд░ рдорд┐рдирд┐рдлрд┐рдХреЗрд╢рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ, рдЬреЗрдПрд╕рд╣рд┐рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░
рдмрд╣реБрдд рдХреБрдЫ ред
рдпрд╣ рдЖрд▓реЗрдЦ рдЕрдиреБрджрд╛рди v0.3.9 рд╕реЗ рдЬрд╛рд░реА v0.4.0 рддрдХ рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рд╡рд╛рд╕ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╣реИред рд╕рдВрд╕реНрдХрд░рдг рдЕрд╕рдВрдЧрдд рд╣реИрдВ рдФрд░ рдЪрд▓рдирд╛ рдЙрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рдерд╛ рдЬрд┐рддрдирд╛ рдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рдореЗрд░рд╛ рдЗрд░рд╛рджрд╛ рдерд╛ред рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдкреВрд░реНрдг рдкреНрд░рд╡рд╛рд╕ рдирд┐рд░реНрджреЗрд╢
рдпрд╣рд╛рдБ рд╣реИрдВ , рдпрд╣ рдореЗрд░реЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╣реИред
рдореИрдВ рдЧреНрд░рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
рдХрд┐рд╕реА рднреА рдЖрд▓рд╕реА рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░ рдХреА рддрд░рд╣, рдореБрдЭреЗ рдПрдХ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рд╕реАрдзреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рддреЛ рдореБрдЭреЗ рдПрдХ рдЧреНрд░рд╛рдВрдЯ рдорд┐рд▓реА рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд┐рдпрд╛:
- рд╕реАрдПрд╕рдПрд╕ рдореЗрдВ рд╕реНрдЯрд╛рдЗрд▓рд╕ рдХрд╛ рд╕рдВрдХрд▓рди;
- gluing рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЗрдВ;
- рд▓рд┐рдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪреЗрдХ;
- рд╕рд░реЗрд╕ рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реБрдЖ рдЬреЗрдПрд╕-рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЦрдирди;
- рд▓реЙрдиреНрдЪ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг ( qUnit );
- рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ред
рдПрдХ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдпреЗ рд╕рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓реЗрдХрд┐рди рдЙрдмрд╛рдК рдХрд╛рд░реНрдп рдХрд┐рдП рдЧрдП рдереЗ:
тЖТ grunt Running "stylus:compile" (stylus) task File 'css/styles.css' created. Running "concat:js" (concat) task File "project.js" created. Running "lint:files" (lint) task Lint free. Running "min:js" (min) task File "project.min.js" created. Uncompressed size: 130468 bytes. Compressed size: 20937 bytes gzipped (74246 bytes minified). Running "qunit:all" (qunit) task Testing index.html...............OK >> 95 assertions passed (594ms) Running "watch" task Waiting...
рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрджрд╛рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: grunt.jsред рдЙрдкрд░реНрдпреБрдХреНрдд рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
module.exports = function(grunt) { grunt.initConfig({ stylus: {
рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛, рдХреЛрдб рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдкреНрд░рд╡рд╛рд╕
рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЧреНрд░рдВрдЯ рдореЙрдбреНрдпреВрд▓ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдХреЛ
npm uninstall -g grunt
:
npm uninstall -g grunt
рдФрд░
рдЧреНрд░рд╛рдВрдЯ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЙрдбреНрдпреВрд▓ npm install -g grunt-cli
:
npm install -g grunt-cli
рдЧреНрд░рдВрдЯ рд╕реНрд╡рдпрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЕрдм рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ
npm install grunt
:
npm install grunt
рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
тЖТ grunt --version grunt-cli v0.1.6 grunt v0.4.0
рдЗрд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЧреНрд░рдВрдЯ-рдЗрдирд┐рдЯ рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ node.js> = 0.8.0 рдХрд╛ рд╕рдВрд╕реНрдХрд░рдгред
рдЕрдиреБрджрд╛рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ
mv grunt.js Gruntfile.js
рдкреБрд░рд╛рдиреЗ рдирд╛рдо рд╡рд╛рд▓реА рдЕрдиреБрджрд╛рди рдлрд╝рд╛рдЗрд▓ рдЕрдм рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдмрд┐рдирд╛ рдирд╛рдо рдмрджрд▓реЗ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрдЦреЗрдВрдЧреЗ:
Fatal error: Unable to find Gruntfile.
рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЕрдиреБрджрд╛рди рдлрд╝рд╛рдЗрд▓ рдХреЛ
CoffeeScript : Gruntfile.cfish рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрдирд╛
рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдЧреНрд░рд╛рдВрдЯ рдореЗрдВ рдЕрдм рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдХреЙрдиреИрдЯ, рдорд┐рди, рд╡реЙрдЪ, рдЖрджрд┐ред рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ
рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
- concat тЖТ рдЧреНрд░рдВрдЯ-рдХреЙрдиреНрдЯреНрд░рд┐рдм-рдХреЙрдиреНрд╕реИрдЯ
- рд▓рд┐рдВрдЯ тЖТ рдЧреНрд░рдВрдЯ-рдХрдВрдЯреНрд░реАрдм-рдЬрд┐рд╢реНрдЯ
- рдиреНрдпреВрдирддрдо тЖТ рдЧреНрд░рдВрдЯ-рдХрдВрдЯреНрд░реАрдм-рдХреБрд░реВрдк
- рдХреНрдпреВрдирд┐рдЯ тЖТ рдЧреНрд░рдВрдЯ-рдХрдВрдЯреНрд░реАрдм-рдХреНрдпреВрдирд┐рдЯ
- рд╡реЙрдЪ тЖТ рдЧреНрд░рдВрдЯ-рдХрдВрдЯреНрд░реАрдм-рд╡реЙрдЪ
рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЧреНрд░рд╛рдВрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЧреНрд░рдВрдЯ-рдХрдВрдЯреНрд░реАрдм рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ-
рд╕реЗрдЯ рдХрд░реЗрдВ:
тЖТ npm install grunt-contrib-concat тЖТ npm install grunt-contrib-jshint тЖТ npm install grunt-contrib-uglify тЖТ npm install grunt-contrib-qunit тЖТ npm install grunt-contrib-watch тЖТ npm install grunt-contrib-stylus
рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк
--save-dev
рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реНрдерд┐рдд рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдирд┐рд░реНрднрд░ рд╣реЛ рдЬрд╛рдПрдБред рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рдо рдЕрдиреБрджрд╛рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-stylus');
рдЧреНрд░рд╛рдВрдЯ рдлрд╛рдЗрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡
рд░рдЬрд┐рд╕реНрдЯрд░рдЯреИрд╕реНрдХ рд╡рд┐рдзрд┐ рдЕрдм рд╡рд┐рднрд╛рдЬрдХ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИред рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рд░реНрдп рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ:
grunt.registerTask('test', 'qunit');
рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
grunt.registerTask('default', ['stylus', 'concat:js', 'jshint', 'min:js', 'qunit', 'watch']);
рдкреНрд░рдкрддреНрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрдЬрд╛рдп
<config:concat.js.dest>
рдЕрдм
<config:concat.js.dest>
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
<%= concat.js.dest %>
ред
Jshint рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдЯ рдХрд╛рд░реНрдп рдЕрдм jshint рдХрд╛рд░реНрдп рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдк рддреБрд░рдВрдд рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
jshint: { options: { smarttabs: true }, js: ['project.js'] }
рдмрджрд╕реВрд░рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдирдЯ рдХрд╛рд░реНрдп рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВред Src / dest рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
uglify: { js: { files: { 'project.min.js': ['<%= concat.js.dest %>'] } } }
рдШрдбрд╝реА рдХреЗ рдХрд╛рд░реНрдп рдореЗрдВ, рд╣рдо рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ:
watch: { js: { files: ['src/*.js'], tasks: ['concat', 'lint'] } }
рдЗрд╕ рдкрд░ рдореЗрд░рд╛ рдХрджрдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛, рдФрд░ рдЧреНрд░рд╛рдВрдЯ рдиреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд┐рдпрд╛ред рдЕрдиреБрджрд╛рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ:
module.exports = function(grunt) { grunt.initConfig({
рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА