[ Nodejs学习(1) ] - 通过grunt+nodemon+livereload实现自动化

熵流
• 阅读 3406

今天在做nodejs练习的时候,因为是用的笔记本,刷新需要用FN + F5键才行,这特么太闹心了,于是想是不是可以自动刷新页面呢?于是乎查了查资料,昨天弄了大半天总是不执行,因为nodejs也是刚接触,还不是特别熟悉,摸索了一上午,终于实现了,分享一下过程,希望对大家有帮助。

废话说完,正文开始:

因为自己也是二把刀,不敢说太多,只是把自己的一些想法说在这里,如有错误,请大家指正,共同进步

相关内容
React + Less + swig + grunt + livereload + nodemon
推荐一个npm package的网站,内容很详细:
npm Package介绍

grunt也不多介绍了,直接贴网站吧:跳转

代码如下:

module.exports = function (grunt) {
    require('load-grunt-tasks')(grunt);
    grunt.initConfig({
        pkg:grunt.file.readJSON('package.json'),
        nodemon: {
            dev: {
                script: './server.js',
                options: {
                    args: ['dev'],
                    nodeArgs: ['--debug'],
                    ignore: ['README.md', 'node_modules/**', '.idea'],
                    ext: 'html,js',
                    watch: ['./views','./app','./routes'],
                    delay: 1000,
                    env: {
                        PORT: '3000'
                    },
                    cwd: __dirname
                }
            }
        },
        /* js处理 begin */
        //brower 自动化将jsx文件转换成js文件
        browserify:{
            options: {
                transform:  [ require('grunt-react').browserify ]
            }
        },
        //react 配置react对应的jsx的文件路径和生成路径以及后缀名
        react: {
            options:{
                es6module:true
            },
            dynamic_mappings: {
                files: [
                    {
                        expand: true,
                        cwd: 'src/jsx',
                        src: ['*.jsx'],
                        dest: 'build/js',
                        ext: '.min.js'
                    }
                ]
            }
        },
        //babel 主要引入es6
        babel: {
            options: {
                sourceMap: true,
                presets: ['babel-preset-es2015']
            },
            dist: {
                files: [{
                    expand:true,
                    cwd:'build/js',
                    src:['*.js'],
                    dest:'build/js'
                }]
            }
        },
        //压缩js
        uglify:{
            prod:{
                options:{
                    mangle: {
                        except: ['require', 'exports', 'module', 'window']
                    },
                },
                files:[{
                    expand:true,
                    cwd:'build/js',
                    src:['*.js'],
                    dest:'build/js'

                }]
            }

        },
        /* js处理 end */

        /* less处理 begin */
        //less less动态转换成css文件并定义后缀名
        less: {
            development: {
                files: [{
                    expand: true,
                    cwd: 'src/less',
                    src: ['*.less'],
                    dest: 'build/css',
                    ext: '.min.css'
                }]
            }
        },
        //压缩css
        cssmin:{
            prod:{
                options:{
                    report:'gzip'
                },
                files:[{
                    expand:true,
                    cwd:'build/css',
                    src:['*.css'],
                    dest:'build/css'
                }]
            }
        },
        /* less处理 end */

        //watch 字面意思:看着某个事件。实现热部署,个人认为是grunt的自动化工具的精髓之一
        watch: {
            script:{
                options:{
                    livereload:true  //livereload工具,浏览器安装插件后,不用重启服务器,不用刷新页面,好神奇的说
                },
                files:'src/jsx/*.jsx',//如果jsx的文件有变化,就执行任务
                tasks:['browserify','babel','uglify']
            },
            css:{
                options:{
                    livereload:true
                },
                files:'src/less/*.less',//如果css的文件有变化,就执行任务
                tasks:['less','cssmin']
            },
            html:{
                options:{
                    livereload:true
                },
                files:['views/**/*.html'] //如果swig的文件有变化,就执行任务
            }
        },
        concurrent:{
            develop:{
                tasks:['watch','nodemon'],
                options:{
                    logConcurrentOutput:true
                }
            }

        }
    });
    // 加载包含任务的插件。
    require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);

    // 默认被执行的任务列表。
    grunt.registerTask('default', ['react','less','babel','uglify','concurrent:develop']);
}

虽然jsx和less编译压缩并不需要重启服务(我觉得是这样的),但是swig模板如果有改动,就需要重启node,要不干刷新也没用,所以用到了nodemon。
nodemon:可以在你修改某文件后重启node,蛮贴心的。

说到刷新,就会提到livereload了。
livereload:这里感谢@JustinLiao,感谢他在我问题下的回答

为什么能自动刷新网页。其实就是你的服务器起了一个TCP/TLS Server,并监听一个端口。网页livereload脚本与这个端口建立连接,当服务器文件发生变化,服务器向通知浏览器执行刷新命令,这样你可以尝试如何让HTTPS的服务器也能够实现自动刷新。

grunt下的其他就比较简单一些了,网上也比较多了,就不多废话了,主要还是要理清nodemon和livereload,我之前总的错误是没有把server:port,nodemon:port和livereload:port分清楚,傻傻的以为需要把这三个port都设置成一个,但是这明显是错误的,先不说端口占用,这三个本身都是分开来走的。
其实如果你设置了nodemon:port,就没有必要再另外起server:port,因为本身这样就是重复的了,只要根据nodemon:port来开发就够了。
至于livereload:port,这个几乎是不用动的,因为他的作用就是看你文件是否有修改,修改了,咱就告诉浏览器刷新一下,不和其他的掺和。

可能说的有点儿乱,记录一下一天的研究成果,分享给大家,如有错误希望大神指正,也希望对初学者有帮助。

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
代码还原的技术: Unidbg hook_add_new实现条件断点(二)
一、目标在做代码还原的时候,有时候会分析一组结果,希望在中途下个条件断点,比如在代码行0x1234,R00x5678的时候触发断点。今天我们就来试着搞一下。TIP:Unidbg代码同步到官方最新版,最新版已经支持浮点寄存器的显示了。二、步骤先写个floatdemotwo把祖传算法升个级extern"C"JNIEXPORTjstringJNIC
Stella981 Stella981
4年前
Python Challenge Level 18
初学Python,挑战一下流行的PythonChallenge,很不幸,卡在了18关~~被字符字节码之间的转换搞得焦头烂额,不过终于搞定了还是很happy的~~~主要的问题就是16进制形式的字符如何转成字节码(注意:不是encoding)如:\'89','50','4e','47','0d','0a','1a','0a','00
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
4年前
Hibernate纯sql查询结果和该sql在数据库直接查询结果不一致
问题:今天在做一个查询的时候发现一个问题,我先在数据库实现了我需要的sql,然后我在代码中代码:selectdistinctd.id,d.name,COALESCE(c.count_num,0),COALESCE(c.count_fix,0),COALESCE(c
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
万字长文,聊聊我在锦礼成长的这一年
”学而不思则罔,思而不学则殆“,本文记录了作者在锦礼侧工作1年间遇到的思考与成长、挑战与困难,也是对过去工作的总结与反思,分享出来,希望对大家有所帮助。本文约10000字如果觉得页面很长那是因为截图和留言很多,哈哈00引言光阴似箭,来到锦礼产品线已满一年了