VS2015前端工具:NPM和Web Essentials

本文详细介绍如何在Visual Studio 2015 CTP6环境中配置和使用NPM、Bower、Grunt及WebEssentials,实现前端资源的安装、压缩和编译等自动化任务。

1.写作背景

    想在5月份前换个工作环境了,“检讨”一下自己混饭的技术水平和处世的人脉关系,觉得很不给力!为人方面,人各有志也就不纠结了,但本领得尽量提高一下。

    我也不擅长写博客,也发觉以前写过的,要不半途而废,要不质量惨不忍睹,所以以前博文干脆全部删除,试着再回顾一遍也罢!

2.本章概述

    VS2015 CTP6下的NPM(bower及grunt)和Web Essentials基本安装和使用.如果你是web前端开发人员,建议熟练掌握。

3.NPM

    a package manager for JavaScript. 它是一个使用Node.js技术的包管理和分发工具,可以方便地找到特定服务要使用的包,进行下载、安装以及管理已经安装的包。

    注:官方https://www.npmjs.com

4.Bower

    web包配置管理工具,允许您下载(一般从github等托管源码网站)和安装或还原软件包,一般处理是 JavaScript 和 CSS 库等静态文件。

    注:对于静态文件安装包,仍可以使用 NuGet 程序包管理器。NPM技术应用非常广泛,VS没有理由不集成它。

5.Grunt

    基于Javascript(使用NPM)技术的task runners。task runners是一个应用程序,或者说它是一个任务工具。

6.Web Essentials

    它是VS扩展插件,是 编写CSS, HTML, JavaScript, TypeScript, CoffeeScript or LESS一款强大web开发辅助工具。

    注:官方http://vswebessentials.com

7.创建项目

    为了演示说明,我们创建解决方案名为:GiveCaseBlog,项目模板采用ASP.NET 5 Preview Web API名为:GiveCaseBlog.WebApies,其目录:

    

8.添加grunt及bower

    右键项目“Add':

    

    此时目录会出现:

    

9.下载安装包配置

    打开bower.json修改如下(这里举例下载三个安装包):   

01. {
02. 'name''bower',
03. 'license''Apache-2.0',
04. 'private'true,
05. 'dependencies': {
06. 'jquery''2.1.3',
07. 'jquery-validation''1.13.1',
08. 'jquery-validation-unobtrusive''3.2.2'
09. },
10. 'exportsOverride': {
11. 'jquery': {
12. '''dist/*.*'
13. },
14. 'jquery-validation': {
15. '''dist/jquery.validate.{js,min.js}'
16. },
17. 'jquery-validation-unobtrusive': {
18. '''jquery.validate.unobtrusive.{js,min.js}'
19. }
20. }
21. }

     注:安装时exportsOverride配置的复制文件路径要和bower_components下载过的安装包里要复制文件路径一致!

           配置dependencies下载的安装包版本,如果不知道确切的版本,就等loading之后选择版本!  

    上面配置完毕,保存bower.json文件,就开始下载了。完成后目录:

    

10.安装安装包

     这里说静态文件安装,指的是复制到(包含到)项目中。前面我们已经下载过三个安装包了,可是没有在wwwroot(这个是web项目部署时根目录)文件下出现!

     打开package.json,改为:

01. {
02. 'name''package',
03. 'version''1.0.0',
04. 'private'true,
05. 'devDependencies': {
06. 'grunt''0.4.5',
07. 'grunt-bower-task''0.4.0'
08. }
09. }

     确定之后,目录出现:

       

     再打开gruntfile.js文件,其代码为:

01. /*定义grunt任务和使用grunt插件*/
02.  
03. module.exports = function (grunt) {
04. grunt.initConfig({
05. bower: {
06. install: {
07. options: {
08. targetDir: 'wwwroot/Libraries',
09. layout: 'byComponent',
10. cleanTargetDir: false
11. }
12. }
13. },
14. });
15.  
16. grunt.registerTask('default', ['bower:install']);
17. grunt.loadNpmTasks('grunt-bower-task');
18. };

      右键gruntfile.js文件:

      

      此时出现:

      

      右键bower选择Run,没有错误信息的话,目录会有:

      

      OK,我们就完成了复制的过程。(注:后面会介绍自动完成这个过程配置及设置) 

11.压缩css

     在项目根目录下,创建Styles文件夹,并在其填加test.css文件,代码为:

1. body {
2. /*背景颜色*/
3. }
4.  
5. a {
6. text-decoration: none;
7. }

      注:此文件有注释,有空格换行的。

      打开package.json,在  'devDependencies'里添加:'grunt-contrib-cssmin': '0.12.2' 

      修改gruntfile.js代码为: 

01. /*定义grunt任务和使用grunt插件*/
02.  
03. module.exports = function (grunt) {
04. grunt.initConfig({
05. bower: {
06. install: {
07. options: {
08. targetDir: 'wwwroot/Libraries',
09. layout: 'byComponent',
10. cleanTargetDir: false
11. }
12. }
13. },
14. /*压缩css*/
15. cssmin: {
16. target: {
17. options: {
18. sourceMap: true,
19. },
20. files: {
21. /*输出文件路径:原始文件路径*/
22. 'wwwroot/Styles/test.min.css''Styles/test.css'
23. }
24. }
25. },
26.  
27. });
28.  
29. grunt.registerTask('default', ['bower:install']);
30. grunt.loadNpmTasks('grunt-bower-task');
31. grunt.loadNpmTasks('grunt-contrib-cssmin'); /*压缩css*/
32. };

      再打开Task Runner Explorer:

      

      执行Run之后,目录出现:

      

      查看test.min.css代码:

      

      OK!去掉换行,空格,注释了!

12.压缩js

      在项目根目录下,创建Scripts文件夹,并其添加test.js文件,其代码为:

1. /*测试*/
2. function Hello() {
3. alert('Hello');
4. }
5.  
6. function World() {
7. alert('World');
8. }

     注释:同样有空格,换行,注释!

     打开package.json,在  'devDependencies'里添加:'grunt-contrib-uglify': '0.8.0' 

     修改gruntfile.js代码为:

01. /*定义grunt任务和使用grunt插件*/
02.  
03. module.exports = function (grunt) {
04. grunt.initConfig({
05. bower: {
06. install: {
07. options: {
08. targetDir: 'wwwroot/Libraries',
09. layout: 'byComponent',
10. cleanTargetDir: false
11. }
12. }
13. },
14. /*压缩css*/
15. cssmin: {
16. target: {
17. options: {
18. sourceMap: true,
19. },
20. files: {
21. /*输出文件路径:原始文件路径*/
22. 'wwwroot/Styles/test.min.css''Styles/test.css'
23. }
24. }
25. },
26. /*压缩js*/
27. uglify: {
28. target: {
29. options: {
30. sourceMap: true,
31. },
32. files: {
33. 'wwwroot/Scripts/test.min.js''Scripts/test.js'
34. }
35. }
36. },
37.  
38. });
39.  
40. grunt.registerTask('default', ['bower:install']);
41. grunt.loadNpmTasks('grunt-bower-task');
42. grunt.loadNpmTasks('grunt-contrib-cssmin'); /*压缩css*/
43. grunt.loadNpmTasks('grunt-contrib-uglify');  /*压缩js*/
44. };

       同样执行Run后,代码会压缩成:

       

13.编译less

       在项目根目录下,创建Lesses文件夹,并其添加site.less文件,其代码为:

01. /*定义变量*/
02. @body-bg-color: #ff6a00;
03.  
04. body {
05.
06. }
07.  
08. #container {
09. width: 960px;
10. }

        打开package.json,在  'devDependencies'里添加:'grunt-contrib-less': '1.0.0'

         修改gruntfile.js代码为:

01. /*定义grunt任务和使用grunt插件*/
02.  
03. module.exports = function (grunt) {
04. grunt.initConfig({
05. bower: {
06. install: {
07. options: {
08. targetDir: 'wwwroot/Libraries',
09. layout: 'byComponent',
10. cleanTargetDir: false
11. }
12. }
13. },
14. /*压缩css*/
15. cssmin: {
16. target: {
17. options: {
18. sourceMap: true,
19. },
20. files: {
21. /*输出文件路径:原始文件路径*/
22. 'wwwroot/Styles/test.min.css''Styles/test.css'
23. }
24. }
25. },
26. /*压缩js*/
27. uglify: {
28. target: {
29. options: {
30. sourceMap: true,
31. },
32. files: {
33. 'wwwroot/Scripts/test.min.js''Scripts/test.js'
34. }
35. }
36. },
37. /*编译less*/
38. less: {
39. //开发版(无压缩)
40. development: {
41. options: {
42. sourceMap: true
43. },
44. files: {
45. 'wwwroot/Styles/site.css''Lesses/site.less'
46. }
47. },
48. //生产版(压缩)
49. production: {
50. options: {
51. compress: true
52. },
53. files: {
54. 'wwwroot/Styles/site.min.css''Lesses/site.less'
55. }
56. }
57. },
58.  
59. });
60.  
61. grunt.registerTask('default', ['bower:install']);
62. grunt.loadNpmTasks('grunt-bower-task');
63. grunt.loadNpmTasks('grunt-contrib-cssmin'); /*压缩css*/
64. grunt.loadNpmTasks('grunt-contrib-uglify');  /*压缩js*/
65. grunt.loadNpmTasks('grunt-contrib-less');   /*编译less*/
66. };

        执行Run后,编译后分别输出一个压缩版,一个未压缩版css文件,目录:

        

14.任务监视

        问题来了: 前面介绍任务需要每次Run,是不是很傻蛋,能不能修改原始文件保存后,自动执行任务?

        打开package.json,在  'devDependencies'里添加:'grunt-contrib-watch': '0.6.1'

        修改gruntfile.js代码为:

       

01. /*定义grunt任务和使用grunt插件*/
02.  
03. module.exports = function (grunt) {
04. grunt.initConfig({
05. bower: {
06. install: {
07. options: {
08. targetDir: 'wwwroot/Libraries',
09. layout: 'byComponent',
10. cleanTargetDir: false
11. }
12. }
13. },
14. /*压缩css*/
15. cssmin: {
16. target: {
17. options: {
18. sourceMap: true,
19. },
20. files: {
21. /*输出文件路径:原始文件路径*/
22. 'wwwroot/Styles/test.min.css''Styles/test.css'
23. }
24. }
25. },
26. /*压缩js*/
27. uglify: {
28. target: {
29. options: {
30. sourceMap: true,
31. },
32. files: {
33. 'wwwroot/Scripts/test.min.js''Scripts/test.js'
34. }
35. }
36. },
37. /*编译less*/
38. less: {
39. //开发版(无压缩)
40. development: {
41. options: {
42. sourceMap: true
43. },
44. files: {
45. 'wwwroot/Styles/site.css''Lesses/site.less'
46. }
47. },
48. //生产版(压缩)
49. production: {
50. options: {
51. compress: true
52. },
53. files: {
54. 'wwwroot/Styles/site.min.css''Lesses/site.less'
55. }
56. }
57. },
58. /*任务监视*/
59. watch: {
60. less: {
61. files: ['Lesses/*.less'],
62. tasks: ['less:development']/*举例监视编译less开发版,并未监视生产压缩版*/
63. }
64. }
65. });
66.  
67. grunt.registerTask('default', ['bower:install']);
68. grunt.loadNpmTasks('grunt-bower-task');
69. grunt.loadNpmTasks('grunt-contrib-cssmin'); /*压缩css*/
70. grunt.loadNpmTasks('grunt-contrib-uglify');  /*压缩js*/
71. grunt.loadNpmTasks('grunt-contrib-less');   /*编译less*/
72. grunt.loadNpmTasks('grunt-contrib-watch');/*任务监视*/
73. };

    把监视开启(执行Run):

    

    此时不要退出(关闭)watch(running)窗口。

    我们修改Lessessite.less文件里代码,并保存此文件,这时wwwrootStylessite.css也会随之改变,但site.min.css并未变化。

15.绑定任务

    在监视任务,我们演示了需要watch(running)窗口不要关闭,同样是很笨的,能不能在打开项目时,让它自动执行Run!这就绑定任务即可。

    

    设置后:

    

    OK!这样vs打开项目时,自动执行此监视任务!(注:绑定项还有别的哦)

16.注册任务

    在gruntfile.js添加:grunt.registerTask('production', ['less:production']);

    这样在Alias项里:

    

17.Web Essentials 安装

     打开vs-》Tools-》Extensions and Updates:

     

18.Web Essentials使用

      下面示例按下Tab键生成代码片段:

        1: 示例div#container1 

          <div id='container1'></div>

        2: 示例div.container2

          <div class='container2'></div>

        3: 示例div>ul  

          <div>

            <ul></ul>

          </div>

      4: 示例div#head>ul.menu 

          <div id='head'>

             <ul class='menu'></ul>    

          </div>

      5: 示例 ul>li*3 

        <ul>    

            <li></li>  

            <li></li>  

            <li></li>   

        </ul> 

      6: 示例div#head>nav.menu>ul>li*3 

         <div id='head'>

             <nav class='menu'>          

                <ul>                

                   <li></li>             

                   <li></li>       

                   <li></li>            

              </ul>       

            </nav>    

        </div>

      7: 示例div#head>nav.menu>ul>li#item$*3

           <div id='head'>    

              <nav class='menu'>         

                  <ul>             

                   <li id='item1'></li>            

                  <li id='item2'></li>              

                  <li id='item3'></li>       

               </ul>      

            </nav>    

         </div>

       8: 示例div#head>nav.menu>ul>li#item$$*3  

          <div id='head'>       

            <nav class='menu'>           

             <ul>           

                <li id='item01'></li>             

                <li id='item02'></li>         

                <li id='item03'></li>        

            </ul>      

          </nav>    

        </div>

    9: 示例div.container>(header>nav)+(div.row>div.context*3) 

     <div class='container'>      

         <header>       

            <nav></nav>        

       </header>   

       <div class='row'>           

         <div class='context'></div>      

         <div class='context'></div>            

         <div class='context'></div>   

       </div>   

    </div>

    选择行快捷键:

    把光标所在行选中使用  Alt+1键,再一次按Alt+1将选择兄弟元素所有行,再一次按Alt+1将选择包含换行空行兄弟元素行 ;

    按下Shift+Alt+W将选择的元素外加个新的元素。

    其它快捷键:

    ctrl+shift+上下键可以让css颜色值变深浅

19.小结

     这篇文章有些臭长了,还有一些举一反三的用法没有介绍。不过已经掌握文中所述,基本上够用。比如使用npm工具来合并css或js没有介绍到,还有测试css,js,html代码也没有提到,再比如压缩编码图片也没有介绍到。再有Web Essentials好多使用技巧也没说到,其实它也可以干编译,压缩和合并等功能。

     那么说NPM这样安装和配置起来,是不是很晕? 其实,我预计VS2015正式版发布后,可能不需要这么繁琐了。总之,此文对你不使用VS开发环境,使用NPM也是很有帮助的。

转载于:https://www.cnblogs.com/simadi/p/6934443.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值