The Hello World for Grunt tutorials is copying files using grunt-contrib-copy task. You can easily find 20k+ articles regarding this topic, but the truth is you don't need grunt-contrib-copy at all. Grunt gives you this functionality out of the box:
In the example above I defined a custom task called copy which copies one file from src to target directory using Grunt API. You can run it with command grunt copy. It doesn't rely on any dependencies beyond Grunt.
Do you think it's awesome? What will happen if you need to add yet another target? The grunt.initConfig() will quickly become unmanageable. Let's write the same logic in a form of custom tasks:
Here we referred directly to the UglifyJS2 library. The task grunt-contrib-uglify does the same thing under the hood, so we've just removed one abstraction layer and one source of potential bugs. Moreover we extracted the code responsible for minification to a function. This approach gives you all the good stuff which comes with functions - you can name it, reuse it, refactor, move to the external file etc.
The problem with tutorials about Grunt is that they describe plugins more than Grunt itself. I encourage you to get familiar with Grunt API and to give custom tasks a shoot before going blindly to the community plugins (which are usually less reliable than they claim to be).