前端構(gòu)建工具 Grunt

Grunt是一個(gè)JavaScript任務(wù)運(yùn)行器

Grunt基于Node.js,用JS 開發(fā)驳棱,這樣就可以借助Node.js實(shí)現(xiàn)跨系統(tǒng)跨平臺(tái)的桌面端的操作,例如文件操作等等。此外叭喜,Grunt以及它的插件們,都作為一個(gè)包堤框,可以用 NPM 安裝進(jìn)行管理域滥。
古老的構(gòu)建工具,基本很少用了

操作步驟

  1. npm install -g grunt-cli 安裝grunt的命令行工具

  2. npm init 生成package.json文件

  3. npm install grunt --save-dev 安裝grunt并加入到依賴

  4. npm install --save-dev grunt-contrib-concat grunt-contrib-jshint grunt-contrib-sass grunt-contrib-uglify grunt-contrib-watch grunt-contrib-connect 安裝常用插件并加入到依賴
    其中 :
    合并文件:grunt-contrib-concat
    語法檢查:grunt-contrib-jshint
    Scss 編譯:grunt-contrib-sass
    壓縮文件:grunt-contrib-uglify
    監(jiān)聽文件變動(dòng):grunt-contrib-watch
    建立本地服務(wù)器:grunt-contrib-connect
    angular 緩存模板 : grunt-angular-templates
    復(fù)制文件 : grunt-contrib-copy
    刪除文件 : grunt-contrib-clean
    壓縮以及合并CSS文件 : grunt-contrib-cssmin
    圖像壓縮模塊 : grunt-contrib-imagemin

  5. 主目錄下創(chuàng)建Gruntfile.js,并進(jìn)行配置

  6. 輸入grunt執(zhí)行default,或 grunt 對(duì)應(yīng)名 執(zhí)行對(duì)應(yīng)操作

js壓縮uglify示例:

module.exports = function(grunt) {

// 配置任務(wù)
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),//固定寫法
    uglify: {
      options: {//通用配置(會(huì)被私有配置覆蓋)
        banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n',
        footer:'\n/*! 我是footer */'
      },
      builda: {//按原目錄批量壓縮
        expand:true,//允許使用占位符*代替其他字符
        cwd:'oldjs',//只壓縮該目錄下的文件
        src: '**/*.js',//**表示任意包括/和空,因此可以用于表示多層文件
        dest: 'newjs',//目標(biāo)文件夾
        ext:'.min.js'//壓縮文件后綴名
      },
      buildb:{
        options:{//私有配置
            mangle:false,//不進(jìn)行代碼混淆
            banner:'//hello nihao\n'
        },
        files:{
            'out/out.js':['jss/**/*.js','src/hello.js']//合并壓縮
        }
      }
    }
  });

//加載插件
  grunt.loadNpmTasks('grunt-contrib-uglify');//加載插件

//任務(wù)注冊(cè)
  grunt.registerTask('aa', ['uglify:builda']);
  grunt.registerTask('bb', ['uglify:buildb']);//輸入grunt bb則運(yùn)行uglify中的buildb方法
  grunt.registerTask('default', ['uglify']);//輸入grunt 即可運(yùn)行整個(gè)uglify
};

熊貓保保

'use strict';

module.exports = function (grunt) {

    grunt.initConfig({
        //jshint
        jshint: {
            all: [
                'anniversary/js/controllers**.js',
            ],
            options: {
                jshintrc: true
            }
        },
        //清空 .build目錄
        clean: ['.build/'],
        //將所有模版文件加入緩存
        ngtemplates: {
            pandaTemplates: {
                src: ['commonPartials/**/*.html', 'panda/partials/**/**.html'],
                dest: 'panda/js/templates.js',
                options: {
                    prefix: '/',
                    htmlmin: {
                        collapseWhitespace: true,
                        collapseBooleanAttributes: true
                    },
                    standalone: true
                }
            },
            productsTemplates: {
                src: ['commonPartials/**/*.html', 'products/partials/**/**.html'],
                dest: 'products/js/templates.js',
                options: {
                    prefix: '/',
                    htmlmin: {
                        collapseWhitespace: true,
                        collapseBooleanAttributes: true
                    },
                    standalone: true
                }
            },
            weaselTemplates: {
                src: ['commonPartials/**/*.html', 'weasel/partials/**/**.html'],
                dest: 'weasel/js/templates.js',
                options: {
                    prefix: '/',
                    htmlmin: {
                        collapseWhitespace: true,
                        collapseBooleanAttributes: true
                    },
                    standalone: true
                }
            },
            okpandaTemplates: {
                src: ['okpanda/partials/**/**.html'],
                dest: 'okpanda/js/templates.js',
                options: {
                    prefix: '/',
                    htmlmin: {
                        collapseWhitespace: true,
                        collapseBooleanAttributes: true
                    },
                    standalone: true
                }
            },
            ruihengTemplates: {
                src: ['ruiheng/partials/**/**.html'],
                dest: 'ruiheng/js/templates.js',
                options: {
                    prefix: '/',
                    htmlmin: {
                        collapseWhitespace: true,
                        collapseBooleanAttributes: true
                    },
                    standalone: true
                }
            }, activityTemplates: {
                src: ['activity/partials/**/**.html'],
                dest: 'activity/js/templates.js',
                options: {
                    prefix: '/',
                    htmlmin: {
                        collapseWhitespace: true,
                        collapseBooleanAttributes: true
                    },
                    standalone: true
                }
            }, claimTemplates: {
                src: ['claim/partials/**/**.html'],
                dest: 'claim/js/templates.js',
                options: {
                    prefix: '/',
                    htmlmin: {
                        collapseWhitespace: true,
                        collapseBooleanAttributes: true
                    },
                    standalone: true
                }
            }, vehicleTemplates: {
                src: ['vehicle/partials/**/**.html'],
                dest: 'vehicle/js/templates.js',
                options: {
                    prefix: '/',
                    htmlmin: {
                        collapseWhitespace: true,
                        collapseBooleanAttributes: true
                    },
                    standalone: true
                }
            },
            reservationTemplates: {
                src: ['reservation/partials/**/**.html'],
                dest: 'reservation/js/templates.js',
                options: {
                    prefix: '/',
                    htmlmin: {
                        collapseWhitespace: true,
                        collapseBooleanAttributes: true
                    },
                    standalone: true
                }
            }
        },
        //復(fù)制文件到.build目錄
        copy: {
            main: {
                files: [
                    {
                        expand: true,
                        cwd: './',
                        src: ['index.html', 'favicon.ico', 'spa.appcache', 'version.json', 'images/**/*', 'commonPartials/**/*'],
                        dest: '.build/'
                    }, {
                        expand: true,
                        cwd: './',
                        src: ['products/index.html', 'products/iframe.html', 'products/images/**', 'products/js/app.js'],
                        dest: '.build/'
                    }, {
                        expand: true,
                        cwd: './',
                        src: ['panda/*.html', 'panda/images/**', 'panda/js/app.js'],
                        dest: '.build/'
                    }, {
                        expand: true,
                        cwd: './',
                        src: ['weasel/index.html', 'weasel/images/**', 'weasel/js/app.js'],
                        dest: '.build/'
                    }, {
                        expand: true,
                        cwd: './',
                        src: ['okpanda/index.html', 'okpanda/images/**', 'okpanda/js/app.js'],
                        dest: '.build/'
                    }, {
                        expand: true,
                        cwd: './',
                        src: ['ruiheng/index.html', 'ruiheng/images/**', 'ruiheng/js/app.js'],
                        dest: '.build/'
                    }, {
                        expand: true,
                        cwd: './',
                        src: ['activity/index.html', 'activity/images/**', 'activity/js/app.js'],
                        dest: '.build/'
                    }, {
                        expand: true,
                        cwd: './',
                        src: ['claim/index.html', 'claim/images/**', 'claim/js/app.js'],
                        dest: '.build/'
                    }, {
                        expand: true,
                        cwd: './',
                        src: ['vehicle/index.html', 'vehicle/images/**', 'vehicle/js/app.js'],
                        dest: '.build/'
                    }, {
                        expand: true,
                        cwd: './',
                        src: ['reservation/index.html', 'reservation/images/**', 'reservation/js/app.js'],
                        dest: '.build/'
                    }
                ]
            }
        },
        //將所有js壓縮成一個(gè)
        uglify: {
            options: {
                mangle: true
            },
            products: {
                files: {
                    '.build/products/js/app.js': ['js/**/*.js', '.build/products/js/app.js', 'products/js/**/*.js', '!products/js/app.js', '!products/js/controllers.js']
                }
            },
            panda: {
                files: {
                    '.build/panda/js/app.js': ['js/**/*.js', '.build/panda/js/app.js', 'panda/js/**/*.js', '!panda/js/app.js'],
                }
            },
            weasel: {
                files: {
                    '.build/weasel/js/app.js': ['js/**/*.js', '.build/weasel/js/app.js', 'weasel/js/**/*.js', '!weasel/js/app.js']
                }
            },
            okpanda: {
                files: {
                    '.build/okpanda/js/app.js': ['js/**/*.js', '.build/okpanda/js/app.js', 'okpanda/js/**/*.js', '!okpanda/js/app.js']
                }
            },
            ruiheng: {
                files: {
                    '.build/ruiheng/js/app.js': ['js/**/*.js', '.build/ruiheng/js/app.js', 'ruiheng/js/**/*.js', '!ruiheng/js/app.js', '!ruiheng/js/componentJS/**']
                }
            }
            ,
            activity: {
                files: {
                    '.build/activity/js/app.js': ['js/**/*.js', '.build/activity/js/app.js', 'activity/js/**/*.js', '!activity/js/app.js', '!activity/js/componentJS/**']
                }
            }, claim: {
                files: {
                    '.build/claim/js/app.js': ['js/**/*.js', '.build/claim/js/app.js', 'claim/js/**/*.js', '!claim/js/app.js', '!claim/js/componentJS/**']
                }
            }, vehicle: {
                files: {
                    '.build/vehicle/js/app.js': ['js/**/*.js', '.build/vehicle/js/app.js', 'vehicle/js/**/*.js', '!vehicle/js/app.js', '!vehicle/js/componentJS/**']
                }
            }, reservation: {
                files: {
                    '.build/reservation/js/app.js': ['js/**/*.js', '.build/reservation/js/app.js', 'reservation/js/**/*.js', '!reservation/js/app.js', '!reservation/js/componentJS/**']
                }
            }
        },
        stripDebug: {
            dist: {
                files: {
                    '.build/products/js/app.js': '.build/products/js/app.js',
                    '.build/panda/js/app.js': '.build/panda/js/app.js',
                    '.build/weasel/js/app.js': '.build/weasel/js/app.js',
                    '.build/okpanda/js/app.js': '.build/okpanda/js/app.js',
                    '.build/ruiheng/js/app.js': '.build/ruiheng/js/app.js',
                    '.build/activity/js/app.js': '.build/activity/js/app.js',
                    '.build/claim/js/app.js': '.build/claim/js/app.js',
                    '.build/vehicle/js/app.js': '.build/vehicle/js/app.js',
                    '.build/reservation/js/app.js': '.build/reservation/js/app.js'
                }
            }
        },
        //壓縮css文件
        cssmin: {
            options: {
                shorthandCompacting: false,
                roundingPrecision: -1
            },
            target: {
                files: {
                    '.build/panda/css/app.css': ['panda/css/*.css', 'css/*.css'],
                    '.build/products/css/app.css': ['products/css/*.css', 'css/*.css'],
                    '.build/weasel/css/app.css': ['weasel/css/*.css', 'css/*.css'],
                    '.build/okpanda/css/app.css': ['okpanda/css/*.css', 'css/*.css'],
                    '.build/ruiheng/css/app.css': ['ruiheng/css/*.css', 'css/*.css'],
                    '.build/activity/css/app.css': ['activity/css/*.css', 'css/*.css'],
                    '.build/claim/css/app.css': ['claim/css/*.css', 'css/*.css'],
                    '.build/vehicle/css/app.css': ['vehicle/css/*.css', 'css/*.css'],
                    '.build/reservation/css/app.css': ['reservation/css/*.css', 'css/*.css']

                }
            }
        },
        concat: {
            panda: {
                files: {
                    '.build/panda/js/app.js': ['.build/panda/js/app.js'],
                    '.build/panda/index.html': ['.build/panda/index.html']

                },
                options: {
                    process: function (src, filepath) {
                        if (filepath.endsWith('app.js')) {
                            src = src.replace('$compileProvider.debugInfoEnabled(true);', '$compileProvider.debugInfoEnabled(false);');
                            return src.replace('/*templates-here*/', "'pandaTemplates',");
                        }
                        if (filepath.endsWith('index.html')) {
                            var start = src.indexOf('<!--start customize js-->') + '<!--start customize js-->'.length;
                            var end = src.indexOf('<!--end customize js-->');
                            src = src.replace(src.substring(start, end), '<script src="js/app.js?v=' + (new Date()).getTime() + '"></script>');
                            start = src.indexOf('<!--start customize css-->') + '<!--start customize css-->'.length;
                            end = src.indexOf('<!--end customize css-->');
                            return src.replace(src.substring(start, end), '<link href="css/app.css?="' + (new Date()).getTime() + ' rel="stylesheet">');
                        }
                    }
                }
            },
            products: {
                files: {
                    '.build/products/js/app.js': ['.build/products/js/app.js'],
                    '.build/products/index.html': ['.build/products/index.html']

                },
                options: {
                    process: function (src, filepath) {
                        if (filepath.endsWith('app.js')) {
                            src = src.replace('$compileProvider.debugInfoEnabled(true);', '$compileProvider.debugInfoEnabled(false);');
                            return src.replace('/*templates-here*/', "'productsTemplates',");
                        }
                        if (filepath.endsWith('index.html')) {
                            var start = src.indexOf('<!--start customize js-->') + '<!--start customize js-->'.length;
                            var end = src.indexOf('<!--end customize js-->');
                            src = src.replace(src.substring(start, end), '<script src="js/app.js?v=' + (new Date()).getTime() + '"></script>');
                            start = src.indexOf('<!--start customize css-->') + '<!--start customize css-->'.length;
                            end = src.indexOf('<!--end customize css-->');
                            return src.replace(src.substring(start, end), '<link href="css/app.css?="' + (new Date()).getTime() + ' rel="stylesheet">');
                        }
                    }
                }
            },
            weasel: {
                files: {
                    '.build/weasel/js/app.js': ['.build/weasel/js/app.js'],
                    '.build/weasel/index.html': ['.build/weasel/index.html']

                },
                options: {
                    process: function (src, filepath) {
                        if (filepath.endsWith('app.js')) {
                            src = src.replace('$compileProvider.debugInfoEnabled(true);', '$compileProvider.debugInfoEnabled(false);');
                            return src.replace('/*templates-here*/', "'weaselTemplates',");
                        }
                        if (filepath.endsWith('index.html')) {
                            var start = src.indexOf('<!--start customize js-->') + '<!--start customize js-->'.length;
                            var end = src.indexOf('<!--end customize js-->');
                            src = src.replace(src.substring(start, end), '<script src="js/app.js?v=' + (new Date()).getTime() + '"></script>');
                            start = src.indexOf('<!--start customize css-->') + '<!--start customize css-->'.length;
                            end = src.indexOf('<!--end customize css-->');
                            return src.replace(src.substring(start, end), '<link href="css/app.css?="' + (new Date()).getTime() + ' rel="stylesheet">');
                        }
                    }
                }
            },
            okpanda: {
                files: {
                    '.build/okpanda/js/app.js': ['.build/okpanda/js/app.js'],
                    '.build/okpanda/index.html': ['.build/okpanda/index.html']

                },
                options: {
                    process: function (src, filepath) {
                        if (filepath.endsWith('app.js')) {
                            src = src.replace('$compileProvider.debugInfoEnabled(true);', '$compileProvider.debugInfoEnabled(false);');
                            return src.replace('/*templates-here*/', "'okpandaTemplates',");
                        }
                        if (filepath.endsWith('index.html')) {
                            var start = src.indexOf('<!--start customize js-->') + '<!--start customize js-->'.length;
                            var end = src.indexOf('<!--end customize js-->');
                            src = src.replace(src.substring(start, end), '<script src="js/app.js?' + (new Date()).getTime() + '"></script>');
                            start = src.indexOf('<!--start customize css-->') + '<!--start customize css-->'.length;
                            end = src.indexOf('<!--end customize css-->');
                            return src.replace(src.substring(start, end), '<link href="css/app.css?="' + (new Date()).getTime() + ' rel="stylesheet">');
                        }
                    }
                }
            },
            ruiheng: {
                files: {
                    '.build/ruiheng/js/app.js': ['.build/ruiheng/js/app.js'],
                    '.build/ruiheng/index.html': ['.build/ruiheng/index.html']

                },
                options: {
                    process: function (src, filepath) {
                        if (filepath.endsWith('app.js')) {
                            src = src.replace('$compileProvider.debugInfoEnabled(true);', '$compileProvider.debugInfoEnabled(false);');
                            return src.replace('/*templates-here*/', "'ruihengTemplates',");
                        }
                        if (filepath.endsWith('index.html')) {
                            var start = src.indexOf('<!--start customize js-->') + '<!--start customize js-->'.length;
                            var end = src.indexOf('<!--end customize js-->');
                            src = src.replace(src.substring(start, end), '<script src="js/app.js?' + (new Date()).getTime() + '"></script>');
                            start = src.indexOf('<!--start customize css-->') + '<!--start customize css-->'.length;
                            end = src.indexOf('<!--end customize css-->');
                            return src.replace(src.substring(start, end), '<link href="css/app.css?="' + (new Date()).getTime() + ' rel="stylesheet">');
                        }
                    }
                }
            },
            activity: {
                files: {
                    '.build/activity/js/app.js': ['.build/activity/js/app.js'],
                    '.build/activity/index.html': ['.build/activity/index.html']

                },
                options: {
                    process: function (src, filepath) {
                        if (filepath.endsWith('app.js')) {
                            src = src.replace('$compileProvider.debugInfoEnabled(true);', '$compileProvider.debugInfoEnabled(false);');
                            return src.replace('/*templates-here*/', "'activityTemplates',");
                        }
                        if (filepath.endsWith('index.html')) {
                            var start = src.indexOf('<!--start customize js-->') + '<!--start customize js-->'.length;
                            var end = src.indexOf('<!--end customize js-->');
                            src = src.replace(src.substring(start, end), '<script src="js/app.js?' + (new Date()).getTime() + '"></script>');
                            start = src.indexOf('<!--start customize css-->') + '<!--start customize css-->'.length;
                            end = src.indexOf('<!--end customize css-->');
                            return src.replace(src.substring(start, end), '<link href="css/app.css?="' + (new Date()).getTime() + ' rel="stylesheet">');
                        }
                    }
                }
            }, claim: {
                files: {
                    '.build/claim/js/app.js': ['.build/claim/js/app.js'],
                    '.build/claim/index.html': ['.build/claim/index.html']

                },
                options: {
                    process: function (src, filepath) {
                        if (filepath.endsWith('app.js')) {
                            src = src.replace('$compileProvider.debugInfoEnabled(true);', '$compileProvider.debugInfoEnabled(false);');
                            return src.replace('/*templates-here*/', "'claimTemplates',");
                        }
                        if (filepath.endsWith('index.html')) {
                            var start = src.indexOf('<!--start customize js-->') + '<!--start customize js-->'.length;
                            var end = src.indexOf('<!--end customize js-->');
                            src = src.replace(src.substring(start, end), '<script src="js/app.js?' + (new Date()).getTime() + '"></script>');
                            start = src.indexOf('<!--start customize css-->') + '<!--start customize css-->'.length;
                            end = src.indexOf('<!--end customize css-->');
                            return src.replace(src.substring(start, end), '<link href="css/app.css?="' + (new Date()).getTime() + ' rel="stylesheet">');
                        }
                    }
                }
            },vehicle: {
                files: {
                    '.build/vehicle/js/app.js': ['.build/vehicle/js/app.js'],
                    '.build/vehicle/index.html': ['.build/vehicle/index.html']

                },
                options: {
                    process: function (src, filepath) {
                        if (filepath.endsWith('app.js')) {
                            src = src.replace('$compileProvider.debugInfoEnabled(true);', '$compileProvider.debugInfoEnabled(false);');
                            return src.replace('/*templates-here*/', "'vehicleTemplates',");
                        }
                        if (filepath.endsWith('index.html')) {
                            var start = src.indexOf('<!--start customize js-->') + '<!--start customize js-->'.length;
                            var end = src.indexOf('<!--end customize js-->');
                            src = src.replace(src.substring(start, end), '<script src="js/app.js?' + (new Date()).getTime() + '"></script>');
                            start = src.indexOf('<!--start customize css-->') + '<!--start customize css-->'.length;
                            end = src.indexOf('<!--end customize css-->');
                            return src.replace(src.substring(start, end), '<link href="css/app.css?="' + (new Date()).getTime() + ' rel="stylesheet">');
                        }
                    }
                }
            },
            reservation: {
                files: {
                    '.build/reservation/js/app.js': ['.build/reservation/js/app.js'],
                    '.build/reservation/index.html': ['.build/reservation/index.html']

                },
                options: {
                    process: function (src, filepath) {
                        if (filepath.endsWith('app.js')) {
                            src = src.replace('$compileProvider.debugInfoEnabled(true);', '$compileProvider.debugInfoEnabled(false);');
                            return src.replace('/*templates-here*/', "'reservationTemplates',");
                        }
                        if (filepath.endsWith('index.html')) {
                            var start = src.indexOf('<!--start customize js-->') + '<!--start customize js-->'.length;
                            var end = src.indexOf('<!--end customize js-->');
                            src = src.replace(src.substring(start, end), '<script src="js/app.js?' + (new Date()).getTime() + '"></script>');
                            start = src.indexOf('<!--start customize css-->') + '<!--start customize css-->'.length;
                            end = src.indexOf('<!--end customize css-->');
                            return src.replace(src.substring(start, end), '<link href="css/app.css?="' + (new Date()).getTime() + ' rel="stylesheet">');
                        }
                    }
                }
            }
        },
        compress: {
            main: {
                options: {
                    mode: 'gzip'
                },
                expand: true,
                cwd: '.build/',
                src: ['**/*.js'],
                dest: '.build/',
                ext: '.js.gz'
            }
        }
    });

    grunt.loadNpmTasks('grunt-angular-templates');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-contrib-clean');
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks("grunt-strip-debug");
    grunt.loadNpmTasks('grunt-contrib-compress');
    grunt.registerTask('build', ['clean', 'ngtemplates', 'copy', 'concat', 'uglify', 'stripDebug', 'cssmin', 'compress']);
    // grunt.registerTask('build', ['clean', 'ngtemplates', 'copy', 'concat', 'uglify', 'cssmin']);

    // Register group tasks
    //grunt.registerTask('build', [ 'jshint', 'less', 'i18n', 'copyto' ]);


};

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜈抓,一起剝皮案震驚了整個(gè)濱河市启绰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沟使,老刑警劉巖委可,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異腊嗡,居然都是意外死亡着倾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門燕少,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卡者,“玉大人,你說我怎么就攤上這事客们〕缇觯” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵底挫,是天一觀的道長(zhǎng)恒傻。 經(jīng)常有香客問我,道長(zhǎng)建邓,這世上最難降的妖魔是什么盈厘? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮官边,結(jié)果婚禮上沸手,老公的妹妹穿的比我還像新娘。我一直安慰自己注簿,他們只是感情好罐氨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滩援,像睡著了一般栅隐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天租悄,我揣著相機(jī)與錄音谨究,去河邊找鬼。 笑死泣棋,一個(gè)胖子當(dāng)著我的面吹牛胶哲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播潭辈,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸯屿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了把敢?” 一聲冷哼從身側(cè)響起寄摆,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎修赞,沒想到半個(gè)月后婶恼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柏副,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年勾邦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片割择。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡眷篇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荔泳,到底是詐尸還是另有隱情蕉饼,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布换可,位于F島的核電站,受9級(jí)特大地震影響厦幅,放射性物質(zhì)發(fā)生泄漏沾鳄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一确憨、第九天 我趴在偏房一處隱蔽的房頂上張望译荞。 院中可真熱鬧,春花似錦休弃、人聲如沸吞歼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篙骡。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間糯俗,已是汗流浹背尿褪。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留得湘,地道東北人杖玲。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像淘正,于是被迫代替她去往敵國(guó)和親摆马。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Grunt入門(一) 什么是grunt Grunt就和photoshop里面的插件一樣鸿吆,它能夠幫我們自動(dòng)完成一些反...
    wheato閱讀 2,239評(píng)論 0 9
  • grunt是一個(gè)優(yōu)秀的前端的自動(dòng)化生產(chǎn)工具囤采,最開始作者一直不用這類工具,感覺麻煩伞剑,但是當(dāng)后面項(xiàng)目大一些后開始嘗試使...
    PengL閱讀 813評(píng)論 3 8
  • 1. grunt是什么 一個(gè)可以運(yùn)行 各種處理前端繁瑣操作(壓縮文件斑唬,刪注釋,測(cè)試等等)的插件 的平臺(tái)黎泣。所謂的自動(dòng)...
    philoZhe閱讀 771評(píng)論 1 3
  • 對(duì)網(wǎng)站資源進(jìn)行優(yōu)化恕刘,并使用不同瀏覽器測(cè)試并不是網(wǎng)站設(shè)計(jì)過程中最有意思的部分,但是這個(gè)過程中的很多重復(fù)的任務(wù)能夠使用...
    懵逼js閱讀 1,069評(píng)論 0 8
  • gulpjs是一個(gè)前端構(gòu)建工具褐着,與gruntjs相比,gulpjs無需寫一大堆繁雜的配置參數(shù)托呕,API也非常簡(jiǎn)單含蓉,學(xué)...
    依依玖玥閱讀 3,154評(píng)論 7 55