рдЬрдмрдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рдЗрди рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдкреИрджрд╛ рд╣реБрдЖ рдерд╛ -
рдирд┐рд╢реНрдЪрд┐рдд ред
рдПрдХ рдореЙрдбреНрдпреВрд▓рд░ рдкреНрд░рдгрд╛рд▓реА рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрд╕ рдореЙрдбреНрдпреВрд▓рд░ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ред рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрд░реЛрдд рдХреЛрдб рдЖрд╕рд╛рдиреА рд╕реЗ рдЖрдкрд╕ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдЖрддреНрдо-рдирд┐рд╣рд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдХрдЯреНрдареЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред
рд╡рд┐рдЪрд╛рд░ рдХреА рдЕрдЪреНрдЫреА рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рд╕рд░рд▓ рд╕реЗ рдЬрдЯрд┐рд▓ рддрдХ рдХреИрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рддрд╣рддред
рдПрдХ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХрд╛ рд╕рд╛рд░ рдЙрддреНрдкрд╛рдж рдкреГрд╖реНрда рд▓реЗ рд▓реЛ,
index.html
:
<html> <head> <meta charset="utf-8"/> <title> -</title> <script src="jquery.js"></script> <script src="https://rawgithub.com/tenorok/definer/master/definer.js"></script> <script src="modules/cart.js"></script> <script src="modules/list.js"></script> </head> <body> <ul class="list"> <li class="item"> <span class="name"></span>, <span class="price">250</span> </li> <li class="item"> <span class="name"></span>, <span class="price">100</span> </li> <li class="item"> <span class="name"></span>, <span class="price">300</span> </li> </ul> </body> </html>
рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдбреЛрдо рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
Cart
рдореЙрдбреНрдпреВрд▓ рдЬреЛ рд╕рд╛рдорд╛рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдЯреЛрдХрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рд▓ рдХреА рдХреБрд▓ рд▓рд╛рдЧрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:
definer('Cart', function() { function Cart() { this.list = []; } Cart.prototype = { add: function(target) { var item = $(target); this.list.push({ name: item.find('.name').text(), price: +item.find('.price').text() }); }, sum: function() { return this.list.reduce(function(sum, item) { return sum + item.price; }, 0); } }; return Cart; });
Cart
рдирд┐рд░реНрднрд░
list
рдореЙрдбреНрдпреВрд▓ рдЬреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдЖрдЧрдВрддреБрдХ рдмрд╛рддрдЪреАрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
definer('list', function(Cart) { var iCart = new Cart(); $(function() { $('.item').on('click', function(e) { iCart.add(e.currentTarget); console.log(iCart.sum()); }); }); });
рдкрд░рд┐рдгрд╛рдо рдПрдХ рдРрд╕рд╛ рдкреГрд╖реНрда рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдХрд┐рд╕реА рдЙрддреНрдкрд╛рдж рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдЙрддреНрдкрд╛рджреЛрдВ рдХрд╛ рдХреБрд▓ рдореВрд▓реНрдп рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╣рдордиреЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╣реИ рдЬрд┐рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ jQuery рд╣реИред
modules/clean.js
рдореМрдЬреВрджрд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рдордиреЗ
modules/clean.js
:
definer.clean('$');
рдЕрдм
$
рдЪрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╣реАрдВ рд╣реИ:
console.log($);
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ:
definer('Cart', function($) { ... }); definer('list', function($, Cart) { ... });
рд╕рднрд╛
рдЕрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ рдФрд░ рдЖрдк рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдПрдХ рдПрдХрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореЙрдбреНрдпреВрд▓ рдмрд┐рд▓реНрдбрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
npm install definer
рд╣рдо
modules
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд╕рднреА
modules
рдХреЛ
index.js
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ:
./node_modules/.bin/definer -d modules/ index.js
рдЕрдм
index.html
рдореЗрдВ рдХреЗрд╡рд▓ jQuery рдФрд░ рдЕрд╕рдореНрдмрджреНрдз рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
<script src="jquery.js"></script> <script src="index.js"></script>
рдЧреНрд░рдиреНрдЯ-рдбрд┐рдлрд░реЗрдВрдЯ рдХреЗ рд╕рд╛рде рдмрдирд╛рдПрдБ
рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдПрдХ
рдЧреНрд░рдиреНрдЯ рдкреНрд▓рдЧрдЗрди рд╣реИ ред рдЖрдк рдореЙрдбреНрдпреВрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрд╕реЗрдВрдмрд▓реА рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдЧрд░рд╛рдиреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдиреБрджрд╛рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
npm install grunt grunt-cli grunt-contrib-watch grunt-definer
Gruntfile.js
рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
module.exports = function(grunt) { grunt.initConfig({ watch: { scripts: { files: ['modules/*.js'], tasks: ['definer:all'] }, }, definer: { all: { target: 'index.js', directory: 'modules/' } } }); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-definer'); };
рдФрд░ рдирд┐рдЧрд░рд╛рдиреА рд╢реБрд░реВ рдХрд░реЗрдВ:
./node_modules/.bin/grunt watch
рдЕрдм рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ рд╣рдо рдореЙрдбреНрдпреВрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреГрд╖реНрда рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рддреГрддреАрдп-рдкрдХреНрд╖ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдБ
рдЕрдм рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдкреЗрдЬ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИрдВ - jQuery рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдореЙрдбреНрдпреВрд▓ред рдЖрдк рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ jQuery рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреГрд╖реНрда рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЧреНрд░рдиреНрдЯ рд▓рдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП
clean
рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝реЗрдВ:
definer: { all: { target: 'index.js', directory: 'modules/', clean: { $: 'jquery.js' } } }
рдЕрдм
index.html
рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЕрд╕реЗрдВрдмрд▓ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
<script src="index.js"></script>
JSDoc
рдПрдХрддреНрд░рд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде JSDoc рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреНрд░рдиреНрдЯ рд▓рдХреНрд╖реНрдп рдореЗрдВ
jsdoc
рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝реЗрдВ:
jsdoc: { "file": " -", "copyright": "2014 Artem Kurbatov, tenorok.ru", "license": "MIT license", "version": "package.json", "date": true }
JSON рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдЙрд╕реА рдирд╛рдо рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЬрдбрд╝ рдореЗрдВ
package.json
рдлрд╝рд╛рдЗрд▓ рдбрд╛рд▓реЗрдВ:
{ "version": "0.1.0" }
рдирд┐рдореНрди JSDoc рдЗрдХрдЯреНрдареЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ:
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░
рдбрд┐рдлрд╛рдЗрдирд░ рдорджрдж рдХрд░рддрд╛ рд╣реИ:
- рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЛ рддреЛрдбрд╝рдиреЗ
- рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ
- рдЧреНрд░рдВрдЯ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ
рдЧрд┐рдердм рдкрд░
рдирд┐рд╢реНрдЪрд┐рдд рдФрд░
рдЧреНрд░рдВрдЯ-рдирд┐рд╢реНрдЪрд┐рдд рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред