优化了文件过滤,更改文件只会重新生成修改的文件

项目目录构建:

  在入口文件public下,创建html目录,作为前台静态资源目录

  

  

gulp.js文件

  1. /*!
  2. * gulp
  3. * $ npm install gulp gulp-ruby-sass gulp-cached gulp-uglify gulp-rename gulp-concat gulp-notify gulp-filter gulp-jshint gulp-rev-append gulp-cssnano gulp-imagemin browser-sync gulp-file-include gulp-autoprefixer del --save-dev
  4. */
  5.  
  6. var gulp = require('gulp'), // 必须先引入gulp插件
  7. del = require('del'), // 文件删除
  8. less = require('gulp-less'), // less 编译
  9. sourcemaps = require('gulp-sourcemaps'), //确保本地已安装gulp-sourcemaps [cnpm install gulp-sourcemaps --save-dev]
  10. cached = require('gulp-cached'), // 缓存当前任务中的文件,只让已修改的文件通过管道
  11. uglify = require('gulp-uglify'), // js 压缩
  12. rename = require('gulp-rename'), // 重命名
  13. // concat = require('gulp-concat'), // 合并文件
  14. copy = require('gulp-contrib-copy'),//不编译的文件直接copy
  15. notify = require('gulp-notify'), // 相当于 console.log()输出报错信息
  16. filter = require('gulp-filter'), // 过滤筛选指定文件
  17. jshint = require('gulp-jshint'), // js 语法校验
  18. watch = require('gulp-watch'),//重新编译被修改的文件
  19. // revMD5 = require('gulp-rev-append'), // 插入文件指纹(MD5)
  20. // cssnano = require('gulp-cssnano'), // CSS 压缩
  21. imagemin = require('gulp-imagemin'), // 图片优化
  22. browserSync = require('browser-sync'), // 保存自动刷新
  23. connect = require('gulp-connect'), //热刷新(本地服务器)
  24. fileinclude = require('gulp-file-include'), // 可以 复制粘贴过来相同的代码
  25. autoprefixer = require('gulp-autoprefixer'), // 添加 CSS 浏览器前缀
  26. babel = require('gulp-babel'); // 编译es6
  27. plumber = require('gulp-plumber'), //gulp-plumber插件来忽略less编译错误
  28. watch = require('gulp-watch'),//重新编译被修改的文件通过管道
  29. // GJSDuck = require('gulp-jsduck'),//js文档生成
  30. // gjsduck = new GJSDuck(['--out', 'mydoc']),//js文档生成
  31. runSequence = require('run-sequence'), //添加版本号
  32. rev = require('gulp-rev'),//包括插入文件指纹等等
  33. revCollector = require('gulp-rev-collector');//添加版本号
  34. spritesmith=require('gulp.spritesmith');//生成雪碧图
  35. //定义原代码的目录和编译压缩后的目录
  36. var src = 'src',//源代码目录
  37. dist = 'dist';//编译压缩后的目录
  38. //es6编译
  39. // less
  40. gulp.task('less', function () {
  41. return gulp.src(src+'/Public/css/**/*.less') // 传入 less目录
  42. .pipe(plumber()) //忽略错误
  43. // 才能找出哪些文件是被修改过的
  44. .pipe(watch(src+'/Public/css/**/*.less', { ignoreInitial: false }))
  45. // .pipe(cached('less')) // 缓存传入文件,只让已修改的文件通过管道(第一次执行是全部通过,因为还没有记录缓存)
  46. // .pipe(autoprefixer('last 6 version')) // 添加 CSS 浏览器前缀,兼容最新的5个版本
  47. .pipe(less({
  48. plugins: [autoprefixer({
  49. browsers: ['> 1%', 'last 4 versions', 'Chrome>=38', 'Android >= 4.0', 'Firefox ESR', 'Firefox >= 36','iOS 7'],
  50. cascade: false, //是否美化属性值 默认:true 像这样:
  51. remove: false //是否去掉不必要的前缀 默认:true
  52. })]
  53. }))
  54. .pipe(sourcemaps.init()) //资源地图创建
  55. .pipe(sourcemaps.write()) //资源地图写入
  56. .pipe(rename({
  57. suffix: '.min'
  58. })) // 对管道里的文件流添加 .min 的重命名
  59. // .pipe(cssnano()) // 压缩 CSS目录下,此时每个文件都有压缩(*.min.css)和未压缩(*.css)两个版本
  60. .pipe(gulp.dest(dist+'/Public/css')) //输出压缩的css文件
  61. .pipe(notify({
  62. message: "生成文件: <%= file.relative %> @ <%= options.date %>",
  63. templateOptions: {
  64. date: new Date().toLocaleTimeString()
  65. }}))
  66. });
  67. // css (拷贝 *.min.css,常规 CSS 则输出压缩与未压缩两个版本)
  68. gulp.task('css', function () {
  69. return gulp.src(src+'/Public/css/**/*.css')
  70. .pipe(watch(src+'/Public/css/**/*.css', { ignoreInitial: false }))
  71. .pipe(cached('css'))
  72. // .pipe(gulp.dest(dist+'/Public/css')) // 把管道里的所有文件输出到 dist/css 目录
  73. .pipe(filter(['**/*', '!**/*.min.css'])) // 筛选出管道中的非 *.min.css 文件
  74. .pipe(autoprefixer({
  75. browsers: ['> 1%', 'last 4 versions', 'Chrome>=38', 'Android >= 4.0', 'Firefox ESR', 'Firefox >= 36','iOS 7'],
  76. cascade: false, //是否美化属性值 默认:true 像这样:
  77. //-webkit-transform: rotate(45deg);
  78. // transform: rotate(45deg);
  79. remove: false //是否去掉不必要的前缀 默认:true
  80. }))
  81. .pipe(connect.reload()) //页面热刷新
  82. // .pipe(gulp.dest(dist+'/Public/css')) // 把处理过的 css 输出到 dist/css 目录
  83. .pipe(rename({
  84. suffix: '.min'
  85. }))
  86. // .pipe(cssnano())
  87. .pipe(gulp.dest(dist+'/Public/css'))//输出压缩的css
  88. .pipe(notify({
  89. message: "生成文件: <%= file.relative %> @ <%= options.date %>",
  90. templateOptions: {
  91. date: new Date().toLocaleTimeString()
  92. }}))
  93. });
  94. //输出开发目录压缩的css文件
  95. gulp.task('cssmin', function () {
  96. return gulp.src(src+'/Public/css/**/*.min.css')
  97. .pipe(watch(src+'/Public/css/**/*.min.css', { ignoreInitial: false }))
  98. .pipe(cached('css'))
  99. .pipe(gulp.dest(dist+'/Public/css'))//输出压缩的css
  100. .pipe(notify({
  101. message: "生成文件: <%= file.relative %> @ <%= options.date %>",
  102. templateOptions: {
  103. date: new Date().toLocaleTimeString()
  104. }}))
  105.  
  106. })
  107. //生成雪碧图
  108. gulp.task('spritesmith',function(){
  109. return gulp.src(src+'/Public/images/icon/**/*.{jpg,jpeg,png,gif,ico}')
  110. .pipe(spritesmith({
  111. imgName:'images/sprite.png',//保存合并后的名称
  112. cssName:'css/sprite.less',//保存合并后css样式的地址
  113. padding:15,//合并时两个图片的间距
  114. algorithm:'binary-tree',//注释1
  115. //cssTemplate:'dest/css/handlebarsStr.css'//注释2
  116. cssTemplate:function(data){ //如果是函数的话,这可以这样写
  117. var arr=[];
  118. width = data.spritesheet.px.width,
  119. height = data.spritesheet.px.height,
  120. url = data.spritesheet.image,
  121. arr.push("@r:75rem;.icon{display:inline-block};")
  122.        data.sprites.forEach(function (sprite) {
  123. arr.push(
  124. ".icon-"+sprite.name+
  125. "{"+
  126. // "background: url('"+url+"') "+
  127. "background: url('../images/sprite.png?v="+Date.parse(new Date())+"')"+
  128. "no-repeat "+
  129. parseInt(sprite.px.offset_x)+"/@r "+parseInt(sprite.px.offset_y)+"/@r;"+
  130. "background-size: "+ parseInt(width)+"/@r "+parseInt(height)+"/@r;"+
  131. "width: "+parseInt(sprite.px.width)+"/@r;"+
  132. "height: "+parseInt(sprite.px.height)+"/@r;"+
  133. "}\n"
  134. );
  135.   });
  136. return arr.join("");
  137. }
  138. }))
  139. .pipe(gulp.dest(src+'/Public'))
  140. .pipe(notify({ message: 'csssprite完成' }))
  141. .pipe(notify({
  142. message: "生成文件: <%= file.relative %> @ <%= options.date %>",
  143. templateOptions: {
  144. date: new Date().toLocaleTimeString()
  145. }}))
  146. })
  147. // styleReload (结合 watch 任务,无刷新CSS注入)
  148. gulp.task('styleReload', ['less', 'css', 'image'], function () {
  149. return gulp.src([dist+'/Public/css/**/*.css'])
  150. .pipe(cached('style'))
  151. .pipe(browserSync.reload({
  152. stream: true
  153. })); // 使用无刷新 browserSync 注入 CSS
  154. });
  155.  
  156. // script (拷贝 *.min.js,常规 js 则输出压缩与未压缩两个版本)
  157. gulp.task('script', function () {
  158. return gulp.src([src+'/Public/js/**/*.js'])
  159. .pipe(watch(src+'/Public/js/**/*.js', { ignoreInitial: false }))
  160. .pipe(cached('script'))
  161. // 筛选出管道中的非 *.min.js 文件非es6目录文件
  162. .pipe(filter(['**/*', '!**/*.min.js','!**/es6/*.js']))
  163. .pipe(jshint(require('./package').jshintConfig)) // 进行检查(设定导入文件 可以配置在package内)
  164. .pipe(jshint.reporter('default')) // 对代码进行报错提示
  165. .pipe(plumber()) //忽略错误
  166. //es6语法js文件无法直接压缩
  167. .pipe(rename({
  168. suffix: '.min'
  169. }))
  170. .pipe(uglify()) // 压缩js
  171. .pipe(gulp.dest(dist+'/Public/js')) //输出压缩后的js文件
  172. .pipe(notify({ message: 'JS压缩完成' }))
  173. .pipe(notify({
  174. message: "生成文件: <%= file.relative %> @ <%= options.date %>",
  175. templateOptions: {
  176. date: new Date().toLocaleTimeString()
  177. }}))
  178. });
  179. //输出开发目录压缩的js文件
  180. gulp.task('scriptmin', function () {
  181. return gulp.src([src+'/Public/js/**/*.min.js'])
  182. .pipe(watch(src+'/Public/js/**/*.min.js', { ignoreInitial: false }))
  183. .pipe(cached('script'))
  184. .pipe(gulp.dest(dist+'/Public/js')) //输出压缩后的js文件
  185. .pipe(notify({
  186. message: "生成文件: <%= file.relative %> @ <%= options.date %>",
  187. templateOptions: {
  188. date: new Date().toLocaleTimeString()
  189. }}))
  190. })
  191. //处理es6语法压缩
  192. gulp.task('es6', function () {
  193. return gulp.src([src+'/Public/js/es6/**/*.js'])
  194. .pipe(watch(src+'/Public/js/es6/**/*.js', { ignoreInitial: false }))
  195. .pipe(cached('script'))
  196. .pipe(filter(['**/*', '!**/*.min.js'])) // 筛选出管道中的非 *.min.js 文件
  197. /**
  198. * 从package.json专门加载配置避免查找开销
  199. * 提示内容
  200. * 启用有关未定义和未使用变量的警告
  201. */
  202. .pipe(jshint(require('./package').jshintes6)) // 进行检查(设定导入文件 可以配置在package内)
  203. .pipe(jshint.reporter('default')) // 对代码进行报错提示
  204. // // .pipe(jshint('.jshintrc')) // 从指定文件进行检查
  205. // // .pipe(jshint.reporter('default'))
  206. // // .pipe(concat('main.js'))
  207. // .pipe(connect.reload()) //页面热刷新
  208. //es6转码
  209. .pipe(babel({
  210. presets: ['env']
  211. }))
  212. .pipe(plumber()) //忽略错误
  213. //es6语法js文件无法直接压缩
  214. .pipe(rename({
  215. suffix: '.min'
  216. }))
  217. .pipe(uglify()) // 压缩js
  218. .pipe(gulp.dest(dist+'/Public/js')) //输出压缩后的js文件
  219. .pipe(notify({
  220. message: "生成文件: <%= file.relative %> @ <%= options.date %>",
  221. templateOptions: {
  222. date: new Date().toLocaleTimeString()
  223. }}))
  224. });
  225. // image
  226. gulp.task('image', function () {
  227. return gulp.src(src+'/Public/images/**/*.{jpg,jpeg,png,gif,ico}')
  228. .pipe(watch(src+'/Public/images/**/*.{jpg,jpeg,png,gif,ico}', { ignoreInitial: false }))
  229. .pipe(cached('image'))
  230. .pipe(filter(['**/*','!**/icon/*.png']))//除了icon文件夹全部解压出
  231. .pipe(imagemin({
  232. optimizationLevel: 3, //类型:Number 默认:3 取值范围:0-7(优化等级)
  233. progressive: true, //类型:Boolean 默认:false 无损压缩jpg图片
  234. interlaced: true, //类型:Boolean 默认:false 隔行扫描gif进行渲染
  235. multipass: true, //类型:Boolean 默认:false 多次优化svg直到完全优化
  236. }))
  237. // 取值范围:0-7(优化等级),是否无损压缩jpg图片,是否隔行扫描gif进行渲染,是否多次优化svg直到完全优化
  238. .pipe(connect.reload()) //页面热刷新
  239. .pipe(gulp.dest(dist+'/Public/images'))
  240. .pipe(notify({
  241. message: "生成文件: <%= file.relative %> @ <%= options.date %>",
  242. templateOptions: {
  243. date: new Date().toLocaleTimeString()
  244. }}))
  245. });
  246.  
  247. // html 编译 html 文件并复制字体
  248. gulp.task('html', function () {
  249. return gulp.src([src+'/Home/**/*.html'])
  250. .pipe(watch(src+'/Home/**/*.html', { ignoreInitial: false }))
  251. .pipe(fileinclude()) // include html
  252. .pipe(connect.reload()) //页面热刷新
  253. .pipe(gulp.dest(dist+'/Home/'))/*输出html文件*/
  254. .pipe(notify({
  255. message: "生成文件: <%= file.relative %> @ <%= options.date %>",
  256. templateOptions: {
  257. date: new Date().toLocaleTimeString()
  258. }}))
  259. });
  260. // //img生成文件hash编码并生成 rev-manifest.json文件名对照映射
  261. gulp.task('revImg', function(){
  262. return gulp.src(src+'/Public/images/**/*.png')
  263. .pipe(filter(['**/*','!**/icon/*.png']))//除了icon文件夹全部解压出
  264. .pipe(rev())
  265. .pipe(gulp.dest(dist+'/Public/images'))
  266. .pipe(rev.manifest())
  267. .pipe(gulp.dest(dist+'/Public/images'));
  268. });
  269. // //CSS生成文件hash编码并生成 rev-manifest.json文件名对照映射
  270. gulp.task('revCss', function(){
  271. return gulp.src(dist+'/Public/css/**/*.css')
  272. .pipe(rev())
  273. .pipe(gulp.dest(dist+'/Public/css'))//引用的文件添加版本号
  274. .pipe(rev.manifest())
  275. .pipe(gulp.dest(dist+'/Public/css'));//输出json文件索引
  276. });
  277.  
  278. // //js生成文件hash编码并生成 rev-manifest.json文件名对照映射
  279. gulp.task('revJs', function(){
  280. return gulp.src([dist+'/Public/js/**/*.js'])
  281. .pipe(filter(['**/*','!**/**/1.json']))//除了1.json
  282. .pipe(rev())
  283. .pipe(gulp.dest(dist+'/Public/js'))//引用的文件添加版本号
  284. .pipe(rev.manifest())
  285. .pipe(gulp.dest(dist+'/Public/js'));//输出json文件索引
  286. });
  287.  
  288. //Html更换css、js文件版本
  289. gulp.task('revHtml', function () {
  290. return gulp.src([dist+'/**/*.json', dist+'/Home/**/*.html']) /*WEB-INF/Homes是本地html文件的路径,可自行配置*/
  291. .pipe(filter(['**/*','!**/**/1.json']))//除了1.json
  292. .pipe(revCollector())
  293. .pipe(gulp.dest(dist+'/Home/')); /*Html更换css、js文件版本,WEB-INF/Homes也是和本地html文件的路径一致*/
  294. });
  295. //Html更换dev文件版本
  296. gulp.task('dev', function (done) {
  297. ////需要说明的是,用gulp.run也可以实现以上所有任务的执行,
  298. //只是gulp.run是最大限度的并行执行这些任务,
  299. //而在添加版本号时需要串行执行(顺序执行)这些任务,故使用了runSequence.
  300. condition = false;
  301. runSequence(
  302. ['revImg'],
  303. ['revCss'],
  304. ['revJs'],
  305. ['revHtml'],
  306. done);
  307. });
  308.  
  309. // clean 清空 生产 目录
  310. gulp.task('clean', function () {
  311. return del(dist+'/**/*');
  312. });
  313.  
  314. // build,关连执行全部编译任务
  315. gulp.task('build', ['less', 'css', 'script', 'image','html','scriptmin','cssmin','copy'], function () {
  316. gulp.start('html');
  317. });
  318.  
  319. // copy 其他不编译的文件直接copy
  320. gulp.task('copy', function () {
  321. return gulp.src(src+'/**/*.!(jpg|jpeg|png|gif|bmp|scss|less|js|html|tpl|css)')
  322. .pipe(copy())
  323. .pipe(gulp.dest(dist+'/'));
  324. });
  325.  
  326. // default 默认任务,依赖清空dist目录和生成api文档
  327. gulp.task('default', ['clean', 'doc'], function () {
  328. return gulp.start('build');
  329. });
  330.  
  331. //doc生成javascript api文档
  332. gulp.task('doc', function () {
  333. return gulp.src(src+'/Public/js/es6/*.js')
  334. .pipe(gjsduck.doc());
  335. });
  336. // watch 开启本地服务器并监听
  337. gulp.task('watch', ['less', 'css', 'script', 'image','html'], function () {
  338. browserSync.init({
  339. //静态服务器配置
  340. // server: {
  341. // baseDir: 'dist', // 在 dist 目录下启动本地服务器环境,自动启动默认浏览器,设置服务器的根目录
  342. // // index:'Home/Index/index' // 指定默认打开的文件
  343. // },
  344. // 代理服务器配置
  345. port:8050, // 指定访问服务器的端口号
  346. proxy: "http://jjbb3", // 设置本地服务器的地址
  347. notify: true, // 刷新不弹出提示
  348. });
  349. // 监控 html 文件,有变动则执行 html 任务
  350. gulp.watch(src+'/Home/**/*.html', ['html']).on('change',browserSync.reload);
  351. // 监控 雪碧图 文件,有变动则执行CSS注入
  352. gulp.watch(src+'/Public/css/**/sprite.less', ['less','styleReload']);
  353. // 监控 less 文件,有变动则执行less注入
  354. gulp.watch(src+'/Public/css/**/*.less', ['css','styleReload']);
  355. // 监控 CSS 文件,有变动则执行CSS注入
  356. gulp.watch(src+'/Public/css/**/*.css', ['styleReload']);
  357. // 监控 js 文件,有变动则执行 script doc任务
  358. gulp.watch(src+'/Public/js/**/*.js', ['script']);
  359. // 监控图片文件,有变动则执行 image 任务
  360. gulp.watch(src+'/Public/images/**/*', ['image']);
  361. // 监听其他不编译的文件 有变化直接copy
  362. gulp.watch(src+'/Public/**/*.!(jpg|jpeg|png|gif|bmp|scss|js|html)', ['copy']);
  363. // 监控 dist 目录下除 css 目录以外的变动(如js,图片等),则自动刷新页面
  364. gulp.watch([src+'/Public/**/*', src+'/Public/css/**/*']).on('change', browserSync.reload);
  365. });

package.json文件

  1. {
  2. "name": "tpgulp",
  3. "version": "1.0.0",
  4. "description": "我的个人tp-gulp配置",
  5. "main": "gulpfile.js",
  6. "dependencies": {},
  7. "devDependencies": {
  8. "babel-core": "^6.26.0",
  9. "babel-preset-env": "^1.6.1",
  10. "browser-sync": "^2.23.6",
  11. "cloneable-readable": "^1.1.2",
  12. "del": "^3.0.0",
  13. "gulp": "^3.9.1",
  14. "gulp-autoprefixer": "^5.0.0",
  15. "gulp-babel": "^7.0.1",
  16. "gulp-cached": "^1.1.1",
  17. "gulp-connect": "^5.5.0",
  18. "gulp-contrib-copy": "^0.1.3",
  19. "gulp-cssnano": "^2.1.3",
  20. "gulp-file-include": "^2.0.1",
  21. "gulp-filter": "^5.1.0",
  22. "gulp-imagemin": "^4.1.0",
  23. "gulp-jsduck": "^1.0.0",
  24. "gulp-jshint": "^2.1.0",
  25. "gulp-less": "^4.0.0",
  26. "gulp-notify": "^3.2.0",
  27. "gulp-plumber": "^1.2.0",
  28. "gulp-rename": "^1.2.2",
  29. "gulp-rev": "^8.1.1",
  30. "gulp-rev-collector": "^1.3.1",
  31. "gulp-sourcemaps": "^2.6.4",
  32. "gulp-uglify": "^3.0.0",
  33. "gulp-watch": "^5.0.1",
  34. "gulp.spritesmith": "^6.9.0",
  35. "jshint": "^2.9.5",
  36. "less": "^3.0.1",
  37. "modify-filename": "^1.1.0",
  38. "rev-path": "^2.0.0",
  39. "run-sequence": "^2.2.1"
  40. },
  41. "jshintes6": {
  42. "undef": true,
  43. "unused": true,
  44. "predef": [],
  45. "esversion": 6
  46. },
  47. "jshintConfig": {
  48. "undef": true,
  49. "notypeof": true,
  50. "shadow": "inner",
  51. "predef": [],
  52. "unused": false,
  53. "jquery": true,
  54. "eqnull": true
  55. },
  56. "scripts": {
  57. "test": "echo \"Error: no test specified\" && exit 1"
  58. },
  59. "author": "WebZhouT",
  60. "license": "ISC"
  61. }

命令行运行指令

  

  1. cnpm install --save-dev
  2. gulp watch //热刷新
  3. gulp build //压缩输出内容
  4. gulp clean //清空目录下的dist文件
  5.  
  6. https://www.cnblogs.com/NB-JDzhou/p/10197003.html

gulp+tp5配置的更多相关文章

  1. 基于流的自动化构建工具------gulp (简单配置)

    项目上线也有一阵子,回头过来看了看从最初的项目配置到开发的过程,总有些感慨,疲软期,正好花点时间,看看最初的配置情况 随着前端的发展,前端工程化慢慢成为业内的主流方式,项目开发的各种构建工具,也出现了 ...

  2. gulp+ThinkPHP配置

    gulp+ThinkPHP配置 gulp+ThinkPHP配置 目录结构: html |-src 开发目录 |-Home 静态页面 |-Public 静态资源目录 |-dist 生产目录 |-Home ...

  3. gulp使用配置

    gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nodejs中stream来读取和操作数据,其速 ...

  4. 前端构建工具:gulp的配置与使用

    安装gulp 因为gulp是基于node的管理工具,所以要先安装nodejs安装nodejsnodejs下载地址:中文站:http://nodejs.cn/ 英文站:https://nodejs.or ...

  5. 使用gulp自动化配置环境变量

    使用gulp拷贝文件,可以完成开发api环境变量的配置,例如公司的线上环境有三个: 1.alpha线上测试环境 2.dev线上测试环境 3.test 本地测试环境 (4.production 正式系统 ...

  6. gulp实用配置(2)——中小项目

    上一篇的gulp配置很简单,主要就是为了demo的查看和调试,这一篇则会相对详细一些,包括压缩合并打时间戳等. 在互联网环境比较好的城市,需要多人协作的,大一点的项目应该都用上了模块化(这里主要指co ...

  7. gulp实用配置(1)——demo

    在React和Vue推进下,现在很多人都在使用webpack作为自动化构建工具,但其实在很多时候我们并不是一定需要用到它,gulp这样的轻量级构建工具就足够了. 最近一段时间不是太忙,所以就写了三份配 ...

  8. gulp+webpack配置

    转自:https://www.jianshu.com/p/2549c793bb27 gulp gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开 ...

  9. lnmp环境的nginx的tp5配置

    php7.1 server { listen 80; server_name www.tp5.com; access_log /home/wwwroot/access.log combined; er ...

随机推荐

  1. Java 8 文件操作(转)

    我们知道在JDK6甚至之前的时候,我们想要读取一个文本文件也是非常麻烦的一件事,而现在他们都变得简单了, 这要归功于NIO2,我们先看看之前的做法: 读取一个文本文件 BufferedReader b ...

  2. 【转】IntelliJ IDEA中文乱码问题

    1.首先是编辑器的乱码,这个很好解决,file->settings->appearence里面有个Name设置成支持中文的字 体(这个很重要) 同样还要再settings中的Eidtor- ...

  3. D. Kuro and GCD and XOR and SUM

    Kuro is currently playing an educational game about numbers. The game focuses on the greatest common ...

  4. 在腾讯云(windows)上搭建node.js服务器

    1:安装Node.js 使用MSI文件,并按照提示安装node.js,默认情况下,安装程序将 Node.js 发行到 C:\Program Files\nodejs. 但这里我们需要修改安装路径到:D ...

  5. java基础学习周计划之3--每周一练

    每周一练第一周 一. 关键代码:1.斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...数列第一项和第二项是1, 从第三项开始, ...

  6. balancer.go

    package) , {         close(b.upc)     }     return nil } func getHost(ep string) string {     url, u ...

  7. sprintf、strcpy 及 memcpy 函数区别

    这些函数的区别在于 实现功能 以及 操作对象 不同.strcpy 函数操作的对象是 字符串 ,完成 从 源字符串 到 目的字符串 的 拷贝 功能. sprintf 函数操作的对象 不限于字符串 :虽然 ...

  8. bzoj4067 [Ctsc2015]gender

    好神的一道题啊! 我们发现题目中的ln的贡献非常傻逼,但是我们可以发现这个东西的取值只有40个左右,于是我们可以枚举他! 枚举完了对于题里的贡献就是一个普通的最小割,采用的是文理分科的思想,与S连代表 ...

  9. 最短路 BZOJ3694 树链剖分+线段树

    分析: 树剖裸题,[Usaco2009 Jan]安全路经Travel 的简化版 剖开最短路树,遍历每一条没在最短路树上的边. 这种情况下,有且仅有u到v路径上,出来lca之外的点能够通过这条边到达,并 ...

  10. zabbix监控elasticsearch

    1.环境概述 虚拟机系统:CentOS Linux release 7.3.1611 (Core) 宿主机系统:Mac Sierra version 10.12.3 nginx:1.10.3 php: ...