рд╢реБрдн рджреЛрдкрд╣рд░
рдореИрдВрдиреЗ рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рдбрд┐рд▓рдореИрди (рд░реВрдмреА) рд╕реЗ рдПрдХреНтАНрд╕рдкреНрд░реЗрд╕.рдЬреЗрдПрд╕ (рдиреЛрдб) рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдореИрдВ рдЦреБрдж рдмреИрдХ-рдПрдВрдб рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦ рдмрд╣реБрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред
рддреЛ, рдХрд╛рд░реНрдп: рд╕рдВрдмрдВрдзрд┐рдд рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп Nass.js рдкрд░ рдПрдХ рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реИрд╕ (рдХрдВрдкрд╛рд╕), рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╣реИрдо "рдлреНрд▓рд╛рдИ рдкрд░" рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рдеред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреНрд░рдорд╢рдГ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд╕рдВрдХрд▓рди рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рдЧреНрд░рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рдиреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕рдХреА рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдПрдирд╡реАрдПрдо (рд░реВрдмреА рдХреЗ рд▓рд┐рдП рдЖрд░рд╡реАрдПрдо рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
рд╣рдо NVM рдбрд╛рд▓рддреЗ рд╣реИрдВ:
curl https://raw.github.com/creationix/nvm/master/install.sh | sh
рдФрд░ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
source ~/.nvm/nvm.sh
рдЕрдЧрд▓рд╛, рд╣рдо рдиреЛрдб рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ 0.10 рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИред * рдЗрд╕рд▓рд┐рдП, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ):
nvm install 0.10 nvm use 0.10
рдЕрдм рдЖрдк рдЕрдкрдиреЗ npm рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рдиреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рдЧреНрд░рдВрдЯ рдбрд╛рд▓рддреЗ рд╣реИрдВ:
npm install -g express npm install -g grunt-cli
рдПрдХреНрд╕рдкреНрд░реЗрд╕ <рдкреНрд░реЛрдЬреЗрдХреНрдЯ> -e рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ:
express develop -e cd develop
-E рд╡рд┐рдХрд▓реНрдк рдмреЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЛ рдИрдЬреЗрдПрд╕ рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЪреБрдкрдЪрд╛рдк рд╕рд╛рдорд╛рдиреНрдп рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдПрдЪрдПрдордПрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВрдЧреЗред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдРрдк рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдРрдк рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВ
app.engine('html', require('ejs').renderFile);
Npm рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рддреБрд░рдВрдд рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
npm install grunt-contrib-watch grunt-contrib-sass grunt-contrib-compass grunt-contrib-coffee grunt-contrib-haml grunt-express-server --save-dev
(- the -ave-dev рд╡рд┐рдХрд▓реНрдк рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд▓рд┐рдЦреЗрдЧрд╛ред рдРрд╕рд╛ рди рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЦреЛ рджреЗрдВ)
рдЕрдм рд╕рднреА рдЕрдиреНрдп рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
npm install
рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рдЖрдЦрд┐рд░реА: рд╣рдо Gruntfile рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ:
touch Gruntfile.js
рддреИрдпрд╛рд░реА рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИ! рдЕрдм - рд╕реНрд╡рдпрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдПред рдЧреНрд░рдВрдЯрдлрд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрдирд╛
module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'),
рдФрд░ рд╣рдо рдЗрд╕реЗ рднрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред
grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-haml'); grunt.loadNpmTasks('grunt-contrib-sass'); grunt.loadNpmTasks('grunt-contrib-compass'); grunt.loadNpmTasks('grunt-contrib-coffee'); grunt.loadNpmTasks('grunt-express-server');
рдЕрдм рд╣рдо рд╕рдВрдХрд▓рди рдХрд╛рд░реНрдпреЛрдВ (рдХрд╛рд░реНрдпреЛрдВ) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд╣рдо рд╕рднреА рджреГрд╢реНрдп / рдлрд╝реЛрд▓реНрдбрд░, рд╕рднреА js рдФрд░ рдХреЙрдлреА рдХреЛ javascripts /, рд╕рднреА css рдФрд░ рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ рдореЗрдВ scss / рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ:
touch public/javascripts/x.coffee touch public/stylesheets/s.scss touch views/index.haml
рдФрд░ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЧрдП рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗред
rm views/index.ejs
рд╕рднреА рдХреЙрдлреА рдХреЛ рдПрдХ рдЬреЗрдПрд╕ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
haml : { dist: { files: { 'views/index.html': 'views/index.haml' } } }, sass : { dist: { files: { 'public/stylesheets/s.css': 'public/stylesheets/s.scss' } } }, coffee : { compile: { files: { 'public/javascripts/x.js': ['public/javascripts/*.coffee'] } } }
! рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП haml рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, haml рд░рддреНрди (рдФрд░ рд░реВрдмреА, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ) рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рд╕реБрд▓рдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!
Sass рдХреЗ рдмрдЬрд╛рдп Compass рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп (sass) рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛
compass: { dev: { options: { sassDir: ['public/stylesheets'], cssDir: ['public/stylesheets'], environment: 'development' } } },
рдЕрдм рд░рдЬрд┐рд╕реНрдЯрд░ рдЯрд╛рд╕реНрдХ рдмреНрд▓реЙрдХ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВ:
grunt.registerTask('default', ['sass', 'coffee', 'haml']);
(рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╕реИрд╕ рдХреЗ рдмрдЬрд╛рдп рдХрдореНрдкрд╛рд╕)
grunt
рд░рди рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХрд╛рд░реНрдп рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ, рдФрд░ рдЕрдм рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдЖрдк index.html, s.css рдФрд░ x.js. рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдФрд░ рд╡реЙрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдЧреНрд░рдВрдЯрдлрд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рдирд┐рдХрд▓реЗрдЧрд╛:
module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'),
(рддрджрдиреБрд╕рд╛рд░, рдХрдореНрдкрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдШрдбрд╝реА рдХрд╛рд░реНрдп рд╡рд┐рд╡рд░рдг рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдп рдкрдВрдЬреАрдХрд░рдг рдореЗрдВ рдХрдореНрдкрд╛рд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрдореНрдкрд╛рд╕ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)
рдЦреИрд░, рдЕрдм
grunt
рд╕рд╛рде рдЖрдк рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрд░реЛрдд рдмрджрд▓рдиреЗ рдкрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреАред
рдЕрдкрдбреЗрдЯ: рд▓рд┐рд╡рд░реЗрд▓реЛрдбрдЯрд╛рд╕реНрдХ рд╡реЙрдЪ рдХреЛ рд▓рд┐рд╡рд░реЗрд▓рдб рдкреГрд╖реНрда рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдШрдбрд╝реА рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝реЗрдВ:
watch : { options: { livereload: true, nospawn: true }, haml : { files : 'views/*.haml', tasks : 'haml' }, coffee : { files : 'public/javascripts/*.coffee', tasks : 'coffee' },
рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреЛрд░реНрдЯ 35729 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреГрд╖реНрда рдкрд░ рд▓рд┐рд╡рд░реЗрд▓рдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
%script{src:"//localhost:35729/livereload.js"}
===================
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдореИрдВ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡
Sails.js (
рдиреЛрдбреНрд╕ рдкрд░ рд░реЗрд▓-рдЬреИрд╕реЗ MVC) рдФрд░ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб JS рдХреЗ рдЕрдиреНрдп рдЦреБрд╢рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред