SlideShare uma empresa Scribd logo
1 de 21
Baixar para ler offline
The JavaScript Task Runner
Grunt - сборщик проектов
● Написан на JavaScript для Node.js
● Выполняет задачи (tasks)
● Конфиг — обычный JS-файл
● Текущая версия — 0.4
● Используется в jQuery, Modernizr, ...
Пример: структура проекта
+ [src]
- foo.js
- bar.js
- main.js
- main.min.js
Пример: установка
npm uninstall -g grunt
npm install -g grunt-cli
npm init
npm install grunt --save-dev
npm install grunt-contrib-jshint --save-dev
npm install grunt-contrib-uglify --save-dev
npm install grunt-contrib-concat --save-dev
Пример: Gruntfile.js
module.exports = function(grunt){
grunt.initConfig({
//task settings go here
});
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.registerTask('default', ['jshint', 'concat', 'uglify']);
};
Пример: настройка задач
jshint: {
all: ['Gruntfile.js', 'src/*.js']
},
concat: {
dist: { src: 'src/*.js', dest: 'main.js' }
},
uglify: {
all: { files: { 'main.min.js': ['main.js'] } }
}
Пример: запускаем
$ grunt
Running "jshint:all" (jshint) task
>> 3 files lint free.
Running "concat:dist" (concat) task
File "main.js" created.
Running "uglify:all" (uglify) task
File "main.min.js" created.
Done, without errors.
Установка: package.json
{
"name": "grunt-usage-example",
"version": "0.1.0",
"devDependencies": {
"grunt-contrib-jshint": "~0.4.3",
"grunt-contrib-uglify": "~0.2.0",
"grunt-contrib-concat": "~0.2.0",
"grunt": "~0.4.1"
}
}
Шаблоны проектов: grunt-init
$ npm install -g grunt-init
$ git clone git@github.com:gruntjs/grunt-init-jquery.git ~/.
grunt-init/jquery
$ grunt-init jquery
Basic tasks
grunt.registerTask('myAliasTask', ['jshint', 'concat', 'uglify']);
grunt.registerTask('myCustomTask', function(){
grunt.log.writeln(' Current task name: ' + this.name);
});
Multi tasks: описание
grunt.initConfig({
myMultiTask: {
first: 'Single string',
second: [1, 2, 3]
}
});
grunt.registerMultiTask('myMultiTask', function(){
grunt.log.writeln(this.target + ' : ' + this.data);
});
Multi tasks: использование
$ grunt myMultiTask:first
Running "myMultiTask:first" (myMultiTask) task
first : Single string
Done, without errors.
$ grunt myMultiTask:second
Running "myMultiTask:second" (myMultiTask) task
second : 1,2,3
Done, without errors.
Раздельные конфигурации
grunt.initConfig({
jshint: {
debug: { ... },
release: { ... }
}
// ...
// Same for concat and uglify
});
grunt.registerTask('debug', ['jshint:debug', 'concat:debug',
'uglify:debug']);
grunt.registerTask('release', ['jshint:release', 'concat:
release', 'uglify:release']);
Файлы: сокращенный формат
grunt.initConfig({
myTask: {
myTarget: { // сompact format
src: ['src/header.txt', 'src/*.js'],
dest: 'main.js',
nonull: true
}
}
});
Файлы: объект files
grunt.initConfig({
myTask: {
myTarget: { // files object format
files: {
'main.js': ['src/header.txt', 'src/*.js'],
'libs.js': ['lib/*.js']
}
}
}
});
Файлы: массив files
grunt.initConfig({
myTask: {
myTarget: { // files array format
files: [
{ src: ['src/header.txt', 'src/*.js'],
dest: 'main.js', nonull: true },
{ src: ['lib/*.js'], dest: 'libs.js' }
]
}
}
});
Свойства контекста: multi task
grunt.registerMultiTask('myMultiTask', function(){
var task = this;
grunt.log.error('Something went wrong'); // errorCount++
['name', 'nameArgs', 'args', 'errorCount', 'target']
.forEach(function(propName){
grunt.log.writeln(propName + ': ' + task[propName]);
});
});
Свойства контекста: значения
$ grunt myMultiTask:first:second
Running "myMultiTask:first:second" (myMultiTask) task
>> Something went wrong
name: myMultiTask
nameArgs: myMultiTask:first:second
args: second
errorCount: 1
target: first
Асинхронные задачи: описание
grunt.registerTask('asyncTask', function() {
var done = this.async();
console.time('Completed in ');
setTimeout(function(){
console.timeEnd('Completed in ');
done();
}, 1000);
});
Асинхронные задачи: выполнение
$ grunt asyncTask
Running "asyncTask" task
Completed in : 1002ms
Done, without errors.
Программный запуск других задач
grunt.registerTask('myTask', function() {
grunt.task.run('foo', 'bar');
grunt.task.run(['bar', 'baz']);
});

Mais conteúdo relacionado

Mais procurados

ピグライフ と node.js
ピグライフ と node.jsピグライフ と node.js
ピグライフ と node.jsSuguru Namura
 
Debianでできる簡単監視システム。
Debianでできる簡単監視システム。Debianでできる簡単監視システム。
Debianでできる簡単監視システム。Kouhei Maeda
 
6 - Custom Mininet Topology Experiment by Dwina Fitriyandini Siswanto & Siti ...
6 - Custom Mininet Topology Experiment by Dwina Fitriyandini Siswanto & Siti ...6 - Custom Mininet Topology Experiment by Dwina Fitriyandini Siswanto & Siti ...
6 - Custom Mininet Topology Experiment by Dwina Fitriyandini Siswanto & Siti ...SDNRG ITB
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRAMBLER&Co
 
NrStage 사용하기
NrStage 사용하기NrStage 사용하기
NrStage 사용하기Yongwu Choi
 

Mais procurados (6)

ピグライフ と node.js
ピグライフ と node.jsピグライフ と node.js
ピグライフ と node.js
 
Debianでできる簡単監視システム。
Debianでできる簡単監視システム。Debianでできる簡単監視システム。
Debianでできる簡単監視システム。
 
6 - Custom Mininet Topology Experiment by Dwina Fitriyandini Siswanto & Siti ...
6 - Custom Mininet Topology Experiment by Dwina Fitriyandini Siswanto & Siti ...6 - Custom Mininet Topology Experiment by Dwina Fitriyandini Siswanto & Siti ...
6 - Custom Mininet Topology Experiment by Dwina Fitriyandini Siswanto & Siti ...
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тесты
 
NrStage 사용하기
NrStage 사용하기NrStage 사용하기
NrStage 사용하기
 
MFC Message
MFC MessageMFC Message
MFC Message
 

Mais de FDConf

Антон Киршанов - «Квант изменения. Реактивные реакции на React.
Антон Киршанов - «Квант изменения. Реактивные реакции на React.Антон Киршанов - «Квант изменения. Реактивные реакции на React.
Антон Киршанов - «Квант изменения. Реактивные реакции на React.FDConf
 
Игорь Еростенко - Создаем виртуальный тур
Игорь Еростенко - Создаем виртуальный турИгорь Еростенко - Создаем виртуальный тур
Игорь Еростенко - Создаем виртуальный турFDConf
 
Илья Климов - Reason: маргиналы против хайпа
Илья Климов - Reason: маргиналы против хайпаИлья Климов - Reason: маргиналы против хайпа
Илья Климов - Reason: маргиналы против хайпаFDConf
 
Максим Щепелин - Доставляя веб-контент в игру
Максим Щепелин - Доставляя веб-контент в игруМаксим Щепелин - Доставляя веб-контент в игру
Максим Щепелин - Доставляя веб-контент в игруFDConf
 
Александр Черноокий - Как правило "победитель получает все" работает и не раб...
Александр Черноокий - Как правило "победитель получает все" работает и не раб...Александр Черноокий - Как правило "победитель получает все" работает и не раб...
Александр Черноокий - Как правило "победитель получает все" работает и не раб...FDConf
 
Михаил Волчек - Что такое Цифровая мастерская?
Михаил Волчек - Что такое Цифровая мастерская?Михаил Волчек - Что такое Цифровая мастерская?
Михаил Волчек - Что такое Цифровая мастерская?FDConf
 
Radoslav Stankov - Handling GraphQL with React and Apollo
Radoslav Stankov - Handling GraphQL with React and ApolloRadoslav Stankov - Handling GraphQL with React and Apollo
Radoslav Stankov - Handling GraphQL with React and ApolloFDConf
 
Виктор Русакович - Выборы, выборы, все фреймворки… приторны
Виктор Русакович - Выборы, выборы, все фреймворки… приторныВиктор Русакович - Выборы, выборы, все фреймворки… приторны
Виктор Русакович - Выборы, выборы, все фреймворки… приторныFDConf
 
Slobodan Stojanovic - 8 1/2 things about serverless
Slobodan Stojanovic - 8 1/2 things about serverless Slobodan Stojanovic - 8 1/2 things about serverless
Slobodan Stojanovic - 8 1/2 things about serverless FDConf
 
Тимофей Лавренюк - Почему мне зашел PWA?
Тимофей Лавренюк - Почему мне зашел PWA?Тимофей Лавренюк - Почему мне зашел PWA?
Тимофей Лавренюк - Почему мне зашел PWA?FDConf
 
В погоне за производительностью
В погоне за производительностьюВ погоне за производительностью
В погоне за производительностьюFDConf
 
Если у вас нету тестов...
Если у вас нету тестов...Если у вас нету тестов...
Если у вас нету тестов...FDConf
 
Migrate your React.js application from (m)Observable to Redux
Migrate your React.js application from (m)Observable to ReduxMigrate your React.js application from (m)Observable to Redux
Migrate your React.js application from (m)Observable to ReduxFDConf
 
Dart: питание и сила для вашего проекта
Dart: питание и сила для вашего проектаDart: питание и сила для вашего проекта
Dart: питание и сила для вашего проектаFDConf
 
Scalable Angular 2 Application Architecture
Scalable Angular 2 Application ArchitectureScalable Angular 2 Application Architecture
Scalable Angular 2 Application ArchitectureFDConf
 
JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.FDConf
 
CSSO — сжимаем CSS
CSSO — сжимаем CSSCSSO — сжимаем CSS
CSSO — сжимаем CSSFDConf
 
Redux. From twitter hype to production
Redux. From twitter hype to productionRedux. From twitter hype to production
Redux. From twitter hype to productionFDConf
 
Будь первым
Будь первымБудь первым
Будь первымFDConf
 
"Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native ""Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native "FDConf
 

Mais de FDConf (20)

Антон Киршанов - «Квант изменения. Реактивные реакции на React.
Антон Киршанов - «Квант изменения. Реактивные реакции на React.Антон Киршанов - «Квант изменения. Реактивные реакции на React.
Антон Киршанов - «Квант изменения. Реактивные реакции на React.
 
Игорь Еростенко - Создаем виртуальный тур
Игорь Еростенко - Создаем виртуальный турИгорь Еростенко - Создаем виртуальный тур
Игорь Еростенко - Создаем виртуальный тур
 
Илья Климов - Reason: маргиналы против хайпа
Илья Климов - Reason: маргиналы против хайпаИлья Климов - Reason: маргиналы против хайпа
Илья Климов - Reason: маргиналы против хайпа
 
Максим Щепелин - Доставляя веб-контент в игру
Максим Щепелин - Доставляя веб-контент в игруМаксим Щепелин - Доставляя веб-контент в игру
Максим Щепелин - Доставляя веб-контент в игру
 
Александр Черноокий - Как правило "победитель получает все" работает и не раб...
Александр Черноокий - Как правило "победитель получает все" работает и не раб...Александр Черноокий - Как правило "победитель получает все" работает и не раб...
Александр Черноокий - Как правило "победитель получает все" работает и не раб...
 
Михаил Волчек - Что такое Цифровая мастерская?
Михаил Волчек - Что такое Цифровая мастерская?Михаил Волчек - Что такое Цифровая мастерская?
Михаил Волчек - Что такое Цифровая мастерская?
 
Radoslav Stankov - Handling GraphQL with React and Apollo
Radoslav Stankov - Handling GraphQL with React and ApolloRadoslav Stankov - Handling GraphQL with React and Apollo
Radoslav Stankov - Handling GraphQL with React and Apollo
 
Виктор Русакович - Выборы, выборы, все фреймворки… приторны
Виктор Русакович - Выборы, выборы, все фреймворки… приторныВиктор Русакович - Выборы, выборы, все фреймворки… приторны
Виктор Русакович - Выборы, выборы, все фреймворки… приторны
 
Slobodan Stojanovic - 8 1/2 things about serverless
Slobodan Stojanovic - 8 1/2 things about serverless Slobodan Stojanovic - 8 1/2 things about serverless
Slobodan Stojanovic - 8 1/2 things about serverless
 
Тимофей Лавренюк - Почему мне зашел PWA?
Тимофей Лавренюк - Почему мне зашел PWA?Тимофей Лавренюк - Почему мне зашел PWA?
Тимофей Лавренюк - Почему мне зашел PWA?
 
В погоне за производительностью
В погоне за производительностьюВ погоне за производительностью
В погоне за производительностью
 
Если у вас нету тестов...
Если у вас нету тестов...Если у вас нету тестов...
Если у вас нету тестов...
 
Migrate your React.js application from (m)Observable to Redux
Migrate your React.js application from (m)Observable to ReduxMigrate your React.js application from (m)Observable to Redux
Migrate your React.js application from (m)Observable to Redux
 
Dart: питание и сила для вашего проекта
Dart: питание и сила для вашего проектаDart: питание и сила для вашего проекта
Dart: питание и сила для вашего проекта
 
Scalable Angular 2 Application Architecture
Scalable Angular 2 Application ArchitectureScalable Angular 2 Application Architecture
Scalable Angular 2 Application Architecture
 
JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.JavaScript: прошлое, настоящее и будущее.
JavaScript: прошлое, настоящее и будущее.
 
CSSO — сжимаем CSS
CSSO — сжимаем CSSCSSO — сжимаем CSS
CSSO — сжимаем CSS
 
Redux. From twitter hype to production
Redux. From twitter hype to productionRedux. From twitter hype to production
Redux. From twitter hype to production
 
Будь первым
Будь первымБудь первым
Будь первым
 
"Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native ""Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native "
 

Сборка JavaScript-проектов с помощью Grunt