文本内容

使用generator-express创建nodejs MVC DEMO

使用gulp实时编译项目

npm安装二进制包,无须再编译
wget https://nodejs.org/dist/v14.17.5/node-v14.17.5-linux-x64.tar.xz

解压后加入环境变量
export PATH=/opt/app/node-v14.17.5-linux-x64/bin:$PATH

npm install -g yarn

generator-express

An Expressjs generator for Yeoman, based on the express command line tool.

https://www.npmjs.com/

https://www.npmjs.com/package/generator-express

项目初始化

mkdir blog1

cd blog1

npm install -g yo

npm install -g generator-express

npm install -g npm-check

yo express

? Would you like to create a new directory for your project? No
? Select a version to install: MVC
? Select a view engine to use: Pug
? Select a css preprocessor to use: Sass
? Select a database to use: MongoDB
? Select a build tool to use: Gulp

npm-check -u

检查更新并全部选中,使用最新包

  1.  

gulp使用说明

https://gulpjs.com/docs/en/getting-started/quick-start/

babel 能将JS翻译为浏览器识别的JS

https://www.babeljs.cn/

https://www.babeljs.cn/setup#installation

设置中选gulp

.babelrc,与package.json同目录

  1. {
  2. "presets": [ "@babel/preset-env" ],
  3. "plugins": [ "@babel/plugin-transform-runtime" ]
  4. }

gulpfile.js变成gulpfile.babel.js

  1. const gulp = require('gulp');
  2. var babel = require("gulp-babel");
  3. const nodemon = require('gulp-nodemon');
  4. const plumber = require('gulp-plumber');
  5. const named = require('vinyl-named'); // 名字缩写
  6. const uglify = require('gulp-uglify-es').default; //支持ES6的一些写法
  7. const livereload = require('gulp-livereload');
  8. const sass = require('gulp-sass');
  9. const glob = require('glob');
  10. const path = require('path')
  11.  
  12. require('babel-polyfill');
  13.  
  14. let cssTasks = new Map();
  15. //读取src/css/admin/*.scss = > public/css/admin
  16. let cssFiles = glob.sync(__dirname + '/src/css/+(include|admin|blog)/*.scss');
  17. // console.log(cssFiles);
  18.  
  19. cssFiles.forEach(cssFile => {
  20. //给每个文件添加一个task,当某一个文件修改时,不至于编译所有文件
  21. let dest = path.dirname(cssFile.replace('src', 'public'));
  22. cssTasks.set(cssFile, function(cb){
  23.  
  24. gulp.src(cssFile)
  25. .pipe(plumber())
  26. .pipe(sass({outputStyle: 'compressed'}))
  27. .pipe(gulp.dest(dest))
  28. .pipe(livereload());
  29. cb();
  30. });
  31. });
  32.  
  33. function css(cb){
  34. gulp.series(...cssTasks.values());
  35. cb();
  36. }
  37.  
  38. //-------------------js-------------------------------------------------
  39. let jsTasks = new Map();
  40. let jsFiles = glob.sync(__dirname + '/src/js/+(admin|blog)/*.js');
  41. jsFiles.forEach(jsFile => {
  42. //给每个文件添加一个task,当某一个文件修改时,不至于编译所有文件
  43. let dest = path.dirname(jsFile.replace('src', 'public'));
  44. jsTasks.set(jsFile, function(cb){
  45. gulp.src(jsFile)
  46. .pipe(plumber())
  47. .pipe(named()) //名字缩写
  48. .pipe(babel()) //转换JS
  49. .pipe(uglify()) //加强ES6语法支持
  50. .pipe(gulp.dest(dest))
  51. .pipe(livereload());
  52. cb();
  53. });
  54. });
  55. function js(cb){
  56. gulp.series(...jsTasks.values());
  57. cb();
  58. }
  59.  
  60. //-------------------img-------------------------------------------------
  61. function img(cb){
  62. gulp.src('./src/img/*.*')
  63. .pipe(gulp.dest('./public/img/'))
  64. .pipe(livereload());
  65. cb();
  66. }
  67.  
  68. function watch(cb){
  69. // gulp.watch('./src/css/*.scss', gulp.parallel(css));
  70. for(let [key, value] of cssTasks.entries()){
  71. // console.log(value);
  72. gulp.watch(key, gulp.parallel(value));
  73. }
  74. // gulp.watch('./src/js/**/*.js', gulp.parallel(js));
  75. for(let [key, value] of jsTasks.entries()){
  76. // console.log(value);
  77. gulp.watch(key, gulp.parallel(value));
  78. }
  79. gulp.watch('./src/img/*.*', gulp.parallel(img));
  80. cb();
  81. }
  82.  
  83. function develop(cb){
  84. livereload.listen();
  85. nodemon({
  86. script: 'app.js',
  87. ext: 'js coffee pug',
  88. stdout: false
  89. }).on('readable', function () {
  90. this.stdout.on('data', (chunk) => {
  91. if (/^Express server listening on port/.test(chunk)) {
  92. livereload.changed(__dirname);
  93. }
  94. });
  95. this.stdout.pipe(process.stdout);
  96. this.stderr.pipe(process.stderr);
  97. });
  98. cb();
  99. }
  100.  
  101. exports.default = gulp.parallel(img, css, js, watch, develop);

package.json

  1.  
  1. {
    "name": "mystar",
    "version": "0.0.1",
    "private": true,
    "main": "app.js",
    "scripts": {
    "start": "node app.js",
    "test": "NODE_ENV=test mocha --recursive test",
    "test:coverage": "nyc npm test",
    "test:unit": "mocha --recursive test/middleware test/models test/routes",
    "test:integration": "mocha --recursive test/integration"
    },
    "dependencies": {
    "@fortawesome/fontawesome-free": "^5.15.3",
    "body-parser": "^1.13.3",
    "bootstrap": "^5.0.2",
    "compression": "^1.5.2",
    "cookie-parser": "^1.3.3",
    "del": "^6.0.0",
    "express": "^4.13.3",
    "glob": "^7.1.7",
    "jquery": "^3.6.0",
    "method-override": "^3.0.0",
    "mongoose": "^5.12.15",
    "morgan": "^1.6.1",
    "path": "^0.12.7",
    "pug": "^3.0.2",
    "serve-favicon": "^2.3.0"
    },
    "devDependencies": {
    "@babel/core": "^7.14.6",
    "@babel/plugin-transform-runtime": "^7.14.5",
    "@babel/preset-env": "^7.14.7",
    "@babel/register": "^7.14.5",
    "@babel/runtime": "^7.14.6",
    "babel-core": "^7.0.0-bridge.0",
    "babel-polyfill": "^6.26.0",
    "chai": "^4.3.4",
    "debug": "^4.3.1",
    "gulp": "^4.0.2",
    "gulp-babel": "^8.0.0",
    "gulp-clean-css": "^4.3.0",
    "gulp-concat": "^2.6.1",
    "gulp-livereload": "^4.0.2",
    "gulp-nodemon": "^2.0.2",
    "gulp-plumber": "^1.0.0",
    "gulp-rename": "^2.0.0",
    "gulp-sass": "^5.0.0",
    "gulp-uglify": "^3.0.2",
    "gulp-uglify-es": "^2.0.0",
    "mocha": "^9.0.1",
    "node-sass": "^6.0.1",
    "nyc": "^15.1.0",
    "regenerator-runtime": "^0.13.7",
    "sass": "^1.35.2",
    "supertest": "^6.1.3",
    "vinyl-named": "^1.1.0"
    }
    }
  1.  

rm -rf node_modules/
yarn install

然后执行以下命令启动项目

gulp

如果启动失败,可以删除安装包,创建几个关键文件,然后重新安装

http://localhost:3000/

错误示例

  1. Error in plugin "gulp-sass"
  2. Message:
  3.  
  4. gulp-sass 5 does not have a default Sass compiler; please set one yourself.
  5. Both the `sass` and `node-sass` packages are permitted.
  6. For example, in your gulpfile:
  7.  
  8. var sass = require('gulp-sass')(require('sass'));
  9.  
  10. [20:27:24] The following tasks did not complete: <parallel>, <anonymous>
  11. [20:27:24] Did you forget to signal async completion?

教你如何在原生小程序中使用scss预处理语言

01 nodejs MVC gulp 项目搭建的更多相关文章

  1. Spring MVC + Mybatis项目搭建

    1.参考<Java Spring MVC项目搭建(一)——Spring MVC框架集成>配置spring mvc需要的jar包及eclipse配置(主要是针对servlet-api.jar ...

  2. mystar01 nodejs MVC 公共CSS,JS设置

    mystar01 nodejs MVC gulp 项目搭建 config/express.js中定义别名 //将下载的第三方库添加到静态资源路径当中,方便访问 app.use('/jquery', e ...

  3. vue项目搭建介绍01

    目录 vue项目搭建介绍01 vue 项目框架环境搭建: 创建项目: vue 项目创建流程: vue项目搭建介绍01 vue 项目框架环境搭建: vue 项目框架: vue django(类似)(vu ...

  4. 使用gulp+browser-sync搭建前端项目自动化以及自动刷新

    前段时间使用了gulp+browser-sync才发现这个东西真的很好用. 准备工作:(1).安装nodejs.gulp是基于nodejs使用的,所以先安装nodejs,https://nodejs. ...

  5. freemarker + spring mvc + spring + mybatis + mysql + maven项目搭建

    今天说说搭建项目,使用freemarker + spring mvc + spring + mybatis + mysql + maven搭建web项目. 先假设您已经配置好eclipse的maven ...

  6. Spring MVC 项目搭建 -6- spring security 使用自定义Filter实现验证扩展资源验证,使用数据库进行配置

    Spring MVC 项目搭建 -6- spring security使用自定义Filter实现验证扩展url验证,使用数据库进行配置 实现的主要流程 1.创建一个Filter 继承 Abstract ...

  7. Spring MVC 项目搭建 -5- spring security 使用数据库进行验证

    Spring MVC 项目搭建 -5- spring security 使用数据库进行验证 1.创建数据表格(这里使用的是mysql) CREATE TABLE security_role ( id ...

  8. Spring MVC 项目搭建 -4- spring security-添加自定义登录页面

    Spring MVC 项目搭建 -4- spring security-添加自定义登录页面 修改配置文件 <!--spring-sample-security.xml--> <!-- ...

  9. Spring MVC 项目搭建 -3- 快速 添加 spring security

    Spring MVC 项目搭建 -3- 快速 添加 spring security 1.添加 spring-sample-security.xml <!-- 简单的安全检验实现 --> & ...

随机推荐

  1. storm启动报错: InvalidTopologyException(msg:Component: [mybolt] subscribes from non-existent stream: [default] of component [es-bolt])

    storm每一个bolt在emit之后需要把数据传递到下一个bolt,所以declareOUtputFields 一定要写 默认的情况下不用加streamId,如果加了streamId,后面的bolt ...

  2. Android 有意思的脚本(打印温度)

    https://github.com/LineageOS/android_hardware_google_pixel/blob/lineage-18.1/thermal/device.mk #!/sy ...

  3. 《Python语言程序设计》【第3周】基本数据类型

    实例3:天天向上的力量 #DayDayUpQ1.py dayup = pow(1.001,365) daydown = pow(0.999,365) print("向上: {:.2f},向下 ...

  4. Flask搭建弹幕视频网站(1)

    说在前面 也不知道最后能不能完成网站,所以就想把这十多天来学习到的点点滴滴记录下来.学的越来越多,所谓全栈也是需要前端基础,越来越感受到压力,但是遇到一个问题就解决一个问题,慢慢习惯之后感觉也还行.说 ...

  5. 问题 A: 大数阶乘

    题目描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行 ...

  6. HTTP 缓存终极指南

    TL;DR 错误的缓存策略是如何抵消你所做的性能优化工作的. 缓存存在于客户端并且通过chrome或者其他抓包工具查看其状态信息. 客户端通过header中的各个字段做缓存的过期判断. 代理服务器上也 ...

  7. IDEA 运行maven工程报错:No goals have been specified for this build.....解决办法

    出现这种错误可以在pom.xml里配置, 找到<build>标签在下面<plugins>标签上面加上<defaultGoal>compile</default ...

  8. Spark面试题(七)——Spark程序开发调优

    Spark系列面试题 Spark面试题(一) Spark面试题(二) Spark面试题(三) Spark面试题(四) Spark面试题(五)--数据倾斜调优 Spark面试题(六)--Spark资源调 ...

  9. Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  10. myeclipse与tomcat,运行jsp程序

    一.myeclipse中配置JRE 步骤: 1.选择window->preferences->Java->Installed JREs 2.点击窗口右边的"add" ...