grunt实现修改代码实时刷新浏览器
watch: {
js: {
files: ['src/js/**/*.js'],
tasks: ['clean', 'jshint', 'copy', 'concat:concatsass', 'sass', 'concat:build', 'uglify', 'includereplace', 'usemin'],
options: {
livereload: true
}
}
}
grunt.registerTask('dev', [ 'watch']);
然后启动本地服务器打开我们的页面(wamp/node/sublimeServer/ )
var serveStatic = require('serve-static');
var serveIndex = require('serve-index');
var lrPort = 35729;
// 使用connect-livereload模块,生成一个与LiveReload脚本
// <script src="http://127.0.0.1:35729/livereload.js?snipver=1" type="text/javascript"></script>
var lrSnippet = require('connect-livereload')({
port: lrPort
});
// 使用 middleware(中间件),就必须关闭 LiveReload 的浏览器插件
var lrMiddleware = function(connect, options) {
return [
// 把脚本,注入到静态文件中
lrSnippet,
// 静态文件服务器的路径
serveStatic(options.base[0]),
// 启用目录浏览(相当于IIS中的目录浏览)
serveIndex(options.base[0])
];
};
connect: {
options: {
// 服务器端口号
port: 8000,
// 服务器地址(可以使用主机名localhost,也能使用IP)
hostname: 'localhost',
// 物理路径(默认为. 即根目录) 注:使用'.'或'..'为路径的时,可能会返回403 Forbidden. 此时将该值改为相对路径 如:/grunt/reloard。
base: '.'
},
livereload: {
options: {
// 通过LiveReload脚本,让页面重新加载。
middleware: lrMiddleware
}
}
},
watch: {
js: {
files: ['src/js/**/*.js'],
tasks: ['clean', 'jshint', 'copy', 'concat:concatsass', 'sass', 'concat:build', 'uglify', 'includereplace', 'usemin'],
options: {
livereload: lrPort
}
}
},
grunt.registerTask('dev', [ ‘connect','watch’])
,然后启动grunt dev
module.exports = function(grunt) {
var timestamp = new Date().getTime();
var serveStatic = require('serve-static');
var serveIndex = require('serve-index');
var lrPort = 35729;
// 使用connect-livereload模块,生成一个与LiveReload脚本
// <script src="http://127.0.0.1:35729/livereload.js?snipver=1" type="text/javascript"></script>
var lrSnippet = require('connect-livereload')({
port: lrPort
});
// 使用 middleware(中间件),就必须关闭 LiveReload 的浏览器插件
var lrMiddleware = function(connect, options) {
return [
// 把脚本,注入到静态文件中
lrSnippet,
// 静态文件服务器的路径
serveStatic(options.base[0]),
// 启用目录浏览(相当于IIS中的目录浏览)
serveIndex(options.base[0])
];
};
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
connect: {
options: {
// 服务器端口号
port: 8666,
// 服务器地址(可以使用主机名localhost,也能使用IP)
// 物理路径(默认为. 即根目录) 注:使用'.'或'..'为路径的时,可能会返回403 Forbidden. 此时将该值改为相对路径 如:/grunt/reloard。
base: '.'
},
livereload: {
options: {
// 通过LiveReload脚本,让页面重新加载。
middleware: lrMiddleware
}
}
},
watch: {
js: {
files: ['src/js/*.js','!src/js/index.js','src/sass/*.scss','src/*.html','!src/sass/all.scss'],
tasks: ['clean' ,'concat:concatsass', 'concat:dev','sass','uglify:build','copy','cssmin:build', 'usemin'],
options: {
livereload: lrPort
}
}
},
//文件合并
concat: {
options: {
//定义一个用于插入合并输出文件之间的字符
seperator: ';'
},
prod: {
//将要合并的文件
// src:['src/**/*.js'],
//合并后的js文件的存放位置
// dest:['build/<%= pkg.name %>.js']
files: { // Dictionary of files
'src/css/main.css': ['src/css/*.css'],
'src/js/index.js': ['src/js/*.js',"!src/js/env_dev.js",'!src/js/*.min.js'],
}
},
dev: {
files: { // Dictionary of files
'src/css/main.css': ['src/css/*.css'],
'src/js/index.js': ['src/js/*.js',"!src/js/env_prod.js",'!src/js/*.min.js'],
}
},
concatsass: {
files: {
'src/sass/all.scss': ['src/sass/*.scss']
}
}
},
//压缩js
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
build: {
files:{
'dist/js/index.min.js':'src/js/index.js',
}
}
},
//压缩html
htmlmin: {
options: { // Target options
removeComments: true,//去注释
removeCommentsFromCDATA: true,
collapseWhitespace: true // 去换行
},
html: {
files: [{ // Dictionary of files
expand: true,
cwd: 'dist',
src: ['*.html'],
dest: 'dist' //'destination':'source'
}]
}
},
//css压缩
cssmin: {
options: {
//shorthandCompactiong:false,
roundingPercision: -1 //这个属性应该是将样式相同的都提取出来
},
build: {
files: {
'dist/css/main.min.css': 'src/css/main.css',
}
}
},
//处理html中css、js 引入合并问题
usemin: {
html: 'dist/*.html',
options: {
blockReplacements: {
js: function(block) {
return '<script type="text/javascript" src="' + block.dest + '?t=' + timestamp + '"></script>';
},
css: function(block) {
return '<link rel="stylesheet" type="text/css" href="' + block.dest + '?t=' + timestamp + '"/>';
}
}
}
},
//copy
copy: {
src: {
files: [
{ expand: true, cwd: 'src/css', src: ['*.min.css'], dest: 'dist/css' },
{ expand: true, cwd: 'src/js', src: ['*.min.js'], dest: 'dist/js' },
{ expand: true, cwd: 'src/', src: ['*.html'], dest: 'dist' },
]
},
image: {
files: [
{ expand: true, cwd: 'src/images', src: ['*.{png,jpg,jpeg,gif,ico}'], dest: 'dist/images' }
]
}
},
sass: {
dist: {
options: { // Target options
style: 'expanded'
},
files: {
'src/css/all.css': 'src/sass/all.scss'
}
}
},
//清理文件
clean: {
html: ['dist/*.html'],
sass: ['src/sass/all.scss'],
css: ['dist/css','src/css/main.css'],
js: ['dist/js','src/js/index.js'],//,
images: ['dist/images']
}
});
//加载包含"uglify" 任务的插件
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-copy');
//grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-htmlmin');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-usemin');
grunt.loadNpmTasks('grunt-contrib-sass');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-include-replace');
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-contrib-watch');
//默认被执行的任务列表
grunt.registerTask('devT', ['connect','watch'])
grunt.registerTask('prod', ['clean' ,'concat:concatsass','sass', 'concat:prod','uglify:build','copy','cssmin:build','htmlmin' , 'usemin']);
grunt.registerTask('dev', ['clean' ,'concat:concatsass', 'sass','concat:dev','uglify:build','copy','cssmin:build', 'usemin']);
};
9.package.json
{
"name": "applicationForm",
"version": "0.1.0",
"description": "",
"main": "Gruntfile.js",
"directories": {
"test": "test"
},
"dependencies": {
"grunt-sass": "^1.1.0"
},
"devDependencies": {
"connect-livereload": "^0.6.0",
"grunt": "^0.4.5",
"grunt-contrib-clean": "^1.0.0",
"grunt-contrib-coffee": "^1.0.0",
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-connect": "^1.0.2",
"grunt-contrib-copy": "^1.0.0",
"grunt-contrib-cssmin": "^1.0.1",
"grunt-contrib-htmlmin": "^1.4.0",
"grunt-contrib-requirejs": "^1.0.0",
"grunt-contrib-sass": "^1.0.0",
"grunt-contrib-uglify": "^1.0.1",
"grunt-contrib-watch": "^1.0.0",
"grunt-usemin": "^3.1.1",
"properties-reader": "^0.0.15",
"serve-index": "^1.8.0",
"serve-static": "^1.11.1"
},
"scripts": {
"start": "grunt devT",
"prod": "grunt prod",
"dev": "grunt dev"
},
"author": "liheyao",
"license": "ISC"
}
grunt实现修改代码实时刷新浏览器的更多相关文章
- webpack实现修改代码实时刷新浏览器
webpack例子:https://github.com/Aquarius1993/webpackDemo 1. 需要全局和项目安装webpack和webpack-dev-server npm ins ...
- webpack热加载:修改文件自动刷新浏览器并更新
概述 之前用react脚手架,觉得那种修改了能立即自动刷新浏览器并更新的功能实在非常人性化,所以想在开发其它项目的时候能用上.于是查了一些资料记录在此,供以后开发时参考,相信对其他人也有用. 其实代码 ...
- npm scripts 助力前端开发,实时刷新浏览器
用browser-sync或者lite-server来监控文件的改变,当文件改变时,就自动刷新浏览器. 用node-sass来实时编译scss文件. 用parallelshell来异步执行npm sc ...
- struts2中修改Action后刷新浏览器后不能及时更新
在学习strut2的时候,发现如果修改配置文件中Action的时候,刷新浏览器并不能加载修改后的Action,只能关闭服务,重新开启server才能获取到,上网找了许多资料后发现只要在配置文件中加上下 ...
- zTree实现节点修改的实时刷新
一.应用场景 在实际应用中会遇到动态操作树各节点的需求,在增加树节点后如何实时动态刷新树就十分有必要了. 二.项目实践 比如要在test1234节点下新建子节点,首先要选中test1234节点,添 ...
- 利用less监视模式实时预览样式刷新浏览器
[前言]此处介绍的方法只是我个人的用法,相信大家有更好更简洁的方式. 上次写到利用LiveReload解放F5.而且LiveReload可以编辑sass/less/stylus.但是可惜发现LiveR ...
- gulp使用 实现文件修改实时刷新
gulp例子:https://github.com/Aquarius1993/gulpDemo 淘宝镜像:$ npm install -g cnpm --registry=https://regist ...
- 分享Grunt.js配置: watch + liveReload 实时监测文件变化自动刷新浏览器
http://www.tuicool.com/articles/2eaQJn 用Grunt配置watch和liveReload组件,可以实时检测指定的文件变化并自动刷新浏览器.目前基本已经成为了我的必 ...
- VSCode中代码在浏览器中打开及实时刷新
实时刷新方法一: 在项目目录下运行命令: browser-sync start --server --files "**/*.css,**/*.html,**/*.js" 实施刷新 ...
随机推荐
- Elasticsearch之停用词
前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch的停用词 1.有些词在文本中出现的频率非常高,但是对文本所携带 ...
- 批量操作QT UI中的控件
背景:在一个项目中,可能一个UI中存在大量相同的tablewidget,combobox,label等控件,每种可能有100个,此时想对它们进行同样的操作 方案:(以tablewidget为例,UI中 ...
- class文件直接修改_反编译修改class文件变量
今天笔者同事遇到一个问题,客户同事的数据库连接信息直接写在代码中,连接的密码改了,但是又没有源代码,所以只能直接修改Java class文件. 记录一下修改步骤: 1.下载JClassLib_wind ...
- JavaScript内部原理系列-执行上下文(Execution Context)
概要 本文将向大家介绍ECMAScript的执行上下文以及相关的可执行代码类型. 定义 每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文.执行上下文(简称:EC)是个抽 ...
- spring mvc: 多动作控制器(Controller下面实现多个访问的方法)MultiActionController / BeanNameUrlHandlerMapping
spring mvc: 多动作控制器(Controller下面实现多个访问的方法) 比如我的控制器是UserController.java,下面有home, add, remove等多个方法 访问地址 ...
- EFCore
Nuget引用 LinqKit.Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer 然后新建类继承DbConte ...
- Linux系统 SSHD服务安全优化方案
# 1. 修改默认端口 #Port 22 # 2. 修改监听协议,只监听某个或某些网络协议 #AddressFamily any AddressFamily inet # 3. 修改ssh只监听内 ...
- day37 爬虫2(web微信、高性能相关、Scrapy)
s16day37 爬虫2 参考博客:http://www.cnblogs.com/wupeiqi/articles/6229292.html 课堂代码:https://github.com/liyon ...
- python __new__和__init__
转载:http://www.cnblogs.com/tuzkee/p/3540293.html 1 2 3 4 5 6 7 8 class A(object): def __init__(se ...
- printf %m
最近看别人的项目发现有 printf("%m") 这种写法,这是什么输出格式呢? 通过 man 查找得知: m (Glibc extension.) Print output of ...