Express.js + Sass / Compass + CoffeeScript + Haml рдкрд░ рдЖрд╡реЗрджрди

рд╢реБрдн рджреЛрдкрд╣рд░
рдореИрдВрдиреЗ рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рдбрд┐рд▓рдореИрди (рд░реВрдмреА) рд╕реЗ рдПрдХреНтАНрд╕рдкреНрд░реЗрд╕.рдЬреЗрдПрд╕ (рдиреЛрдб) рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдореИрдВ рдЦреБрдж рдмреИрдХ-рдПрдВрдб рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦ рдмрд╣реБрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред

рддреЛ, рдХрд╛рд░реНрдп: рд╕рдВрдмрдВрдзрд┐рдд рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп 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.registerTask('default', ['']); }; 


рдФрд░ рд╣рдо рдЗрд╕реЗ рднрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред

  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'), //      watch : { haml : { files : 'views/*.haml', tasks : 'haml' }, coffee : { files : 'public/javascripts/*.coffee', tasks : 'coffee' }, sass : { files : 'public/stylesheets/*.scss', tasks : 'sass' }, // compass : { // files: ['public/stylesheets/*.{scss,sass}'], // tasks: ['compass'] // } }, express : { dev: { options: { script: 'app.js' } } }, haml : { dist: { files: { 'views/index.html': 'views/index.haml' } } }, sass : { dist: { files: { 'public/stylesheets/s.css': 'public/stylesheets/s.scss' } } }, compass: { dev: { options: { sassDir: ['public/stylesheets'], cssDir: ['public/stylesheets'], environment: 'development' } } }, coffee : { compile: { files: { 'public/javascripts/x.js': ['public/javascripts/*.coffee'] } } } }); //      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'); //   -   grunt.registerTask('default', ['sass', 'coffee', 'haml', 'express', 'watch']); }; 

(рддрджрдиреБрд╕рд╛рд░, рдХрдореНрдкрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдШрдбрд╝реА рдХрд╛рд░реНрдп рд╡рд┐рд╡рд░рдг рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдп рдкрдВрдЬреАрдХрд░рдг рдореЗрдВ рдХрдореНрдкрд╛рд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрдореНрдкрд╛рд╕ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)

рдЦреИрд░, рдЕрдм grunt рд╕рд╛рде рдЖрдк рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрд░реЛрдд рдмрджрд▓рдиреЗ рдкрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреАред

рдЕрдкрдбреЗрдЯ: рд▓рд┐рд╡рд░реЗрд▓реЛрдб
рдЯрд╛рд╕реНрдХ рд╡реЙрдЪ рдХреЛ рд▓рд┐рд╡рд░реЗрд▓рдб рдкреГрд╖реНрда рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдШрдбрд╝реА рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝реЗрдВ:
  watch : { options: { livereload: true, nospawn: true }, haml : { files : 'views/*.haml', tasks : 'haml' }, coffee : { files : 'public/javascripts/*.coffee', tasks : 'coffee' }, // sass : { // files : 'public/stylesheets/*.scss', // tasks : 'sass' // }, compass: { files: ['public/stylesheets/*.{scss,sass}'], tasks: ['compass'] } } 

рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреЛрд░реНрдЯ 35729 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреГрд╖реНрда рдкрд░ рд▓рд┐рд╡рд░реЗрд▓рдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
 %script{src:"//localhost:35729/livereload.js"} 


===================

рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдореИрдВ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ Sails.js ( рдиреЛрдбреНрд╕ рдкрд░ рд░реЗрд▓-рдЬреИрд╕реЗ MVC) рдФрд░ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб JS рдХреЗ рдЕрдиреНрдп рдЦреБрд╢рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред

Source: https://habr.com/ru/post/In215651/


All Articles