ES6项目构建方法

任务自动化(gulp)

gulp:自动化构建工具;任务自动化,就是说,尽量不使用人工,使用工具自动操作一些任务;
gulp的作用:完成任务自动化的工作流;

编译工具(babel、webpack)

  • babel:专门编译es6
  • webpack:处理模块之间的依赖的。
  • webpackwepack-stream的作用:有了webpack-stream,就可以使webpack支持gulp

ES6项目构建

基础架构图

ES6项目创建目录

  • 整体项目目录


    整体项目目录

目录说明

1. app文件

app文件和其中的目录都是手动创建。

2. ejs文件说明

ejs后缀文件:因为es6是使用node环境,这里会使用到ejs的模版引擎,所以这里就使用了ejs后缀的文件,可以当做是.html

3. server文件创建与初始化文件

  • 手动创建server,在server文件夹中初始化文件。
  • 初始化步骤
    a.打开命令框,输入express -e .;启动express脚手架,自动安装如上图sever文件中的目录;
    b.再安装npm install,完成初始化;
关于express的安装:

如果express是3版本以下的,可以直接使用;4版本以上,直接使用上面命令,会提示"express不是内部命令"

解决办法:
1.先安装全局的express --------->  npm install -g express; 
2.安装后,再安装express -generator --------> npm install -g express -generator

完成以上步骤就可以使用express相关命令了。


输入express -e . 安装后的显示

4. tasks文件创建与初始化文件

  • 初始化步骤
1.进入tasks文件,手动创建util文件,放常见脚本,并初始化一个文件 ---> args.js
//args.js配置文件代码
import yargs from 'yargs';//命令行处理
const args = yargs
    .option('production',{//区分开发环境和测试环境
        boolean:true,
        default:false,
        describe:'min all scripts'
    })
    .option('watch',{//是否监听开发环境中修改的文件
        boolean:true,
        default:false,
        describe:'watch all files'
    })
    .option('verbose',{//是否详细输出命令行执行的日志
        boolean:true,
        default:false,
        describe:'log'
    })
    .option('sourcemaps',{//关于正文的映射
        describe:'force the creation of sroucemaps'
    })
    .option('port',{//设置服务器的端口
        string:true,
        default:8080,
        describe:'server port'
    })
    .argv;
export default args;
2.在tasks目录下,手动创建一个scripts.js文件
//scripts.js配置代码
//js任务编译脚本
import gulp from 'gulp';//引入gulp
import gulpif from 'gulp-if';//在gulp中做if判断
import concat from 'gulp-concat';//在gulp中做拼接
import webpack from 'webpack';//打包
import gulpWebpack from 'webpack-stream';//支持gulp webpack包,没有这个包webpack不能直接使用gulp
import named from 'vinyl-named';//文件重命名
import livereload from 'gulp-livereload';//热更新包
import plumber from 'gulp-plumber';//处理文件信息流
import rename from 'gulp-rename';//gulp文件重命名
import uglify from 'gulp-uglify';//压缩js包
import {log, colors} from 'gulp-util';//命令行工具输出包
import args from './util/args';//命令行处理文件,这里的文件需要自己创建配置

gulp.task('scripts', ()=> { //创建一个任何
    return gulp.src(['app/js/index.js'])//打开这个index文件
        //打开文件后要做以下这些事情
        .pipe(plumber({//改变
            errorHandle: function () {  //错误处理是由webpack做的
            }
        }))
        .pipe(named())//文件重命名
        .pipe(gulpWebpack({//配置webpack功能
            module: {
                loaders: [{
                    test: /\.js$/,
                    loader: 'babel-loader'
                }]
            }
        }), null, (err, stats)=> {//对错误的处理
        log(`Finished '${colors.cyan('scripts')}'`,
            stats.toString({chunks: false}))
        })
    .pipe(gulp.dest('server/public/js'))//使用gulp.dest使用这个指定的路径
    //为什么要放到server中,因为js要拿到最新的,才可以在服务器中跑起来
    .pipe(rename({//重新命名
        basename: 'cp',
        extname: '.min.js'}))
    .pipe(uglify({compress: {properties: false}, output: {'quote_keys': true}}))//配置压缩
    //压缩后再存储到指定文件中
    .pipe(gulp.dest('server/public/js'))
    //监听文件,当文件有刷新,就更新这个文件
    .pipe(gulpif(args.watch, livereload()))
})

上面script.js中引入的包需要进行安装,安装方式如下图:
打开命令输入:npm install gulp gulp-if gulp-concat webpack webpack-stream vinyl-named gulp-livereload gulp-plumber gulp-rename gulp-uglify gulp-util yargs --sav


安装后的样子

5. npm创建package.json文件

如下图命令行中进入到根目录下,输入npm install,一路回车即可创建package.json文件。


package.json文件创建方式图

6. 创建.babelrc后缀文件

根目录下,创建一个设置babel编译工作的配置文件。(.babelrc),这个文件名不可随意改变,固定的名字;

7. 创建一个gulp配置文件

根目录下,创建一个gulp配置文件, ---> gulpfile.babel.js,这个文件名也是固定的,不可改变;如果文件名只写成gulp,页面会报错,不会执行gulp;

// gulpfile.babel.js配置代码
import requireDir from 'require-dir';
//将tasks目录下的文件都加载进来运行
requireDir('./tasks');

完成以上创建,项目的目录结构和初始化文件就全部完成了,下面开始创建其它必要文件。

8. 创建模板、服务任务脚本

tasks下创建server.js文件,配置如下:

//server.js配置代码
import gulp from 'gulp'
import gulpif from 'gulp-if'
import liveserver from 'gulp-live-server'
import args from './util/args'
gulp.task('serve',(cb)=>{
    if(!args.watch) return cb();//判断如果不是处理于监听状态下,直接返回回调函数
    //如果是的话,就创建一个服务器,使用liveserver.new()方法
    //--harmony: 参数表示,要在当前命令下执行这个脚本
    //server/bin/www: 是一个服务器脚本,实际上启动的就是,这个路径下的www.js的脚本(理解就可以了)
    var server = liveserver.new(['--harmony','server/bin/www']);
    server.start();//启动服务器
    //使用服务器脚本的目的是,让服务器下面的所有文件(js,ejs等),发生改变时,要让浏览器自动刷新
    //那么就使用以下方法
    /*
    * 使用gulp的watch是用来文件的监听,下面监听了两个路径下对应的文件
    */
    gulp.watch(['server/public/**/*.js','server/views/**/*.ejs'],function(file){
        server.notify.apply(server,[file]);//通知服务器做相应的动作
    })
    //监听需要重起服务器的文件
    gulp.watch(['server/routes/**/*.js','server/app.js'],function(){
        server.start.bind(server)() //重起服务器
    });
})
9. 文件自动监听,项目构建测试
  • tasks目录下创建一个browser.js文件;

browser.js作用说明:项目文件中的app目录下都是所需的前端代码源文件,但是在server.js下配置的热更新是执行的server--->public下的文件,并且scripts.js是向public中写脚本。当源文件发生改变时,如何自动编译,并自动生成到server-->public或者views文件中;这时就需要创建一个browser.js,用于处理监听浏览器;

//browser.js配置代码
//监听浏览器的脚本
import gulp from 'gulp'
import gulpif from 'gulp-if'
import gutil from 'gulp-util'//gulp常用工具,gulp的集合
import args from './util/args'

gulp.task('browser',(cb)=>{
    if(!args.watch) return cb() //如果没有用watch做监听的,直接返回回调
    /*
    * gulp.watch():用于监听
    * 第一个参数,要监听的目录
    * 第二个参数,监听后要执行什么任务
    */
    //监听原始目录下的脚本,如果发生改变,会自动调用 scripts文件
    gulp.watch('app/**/*.js',['scripts'])
    //以下这两个都同理
    gulp.watch('app/**/*.ejs',['pages'])
    gulp.watch('app/**/*.css',['css'])
})
  • tasks目录下创建clean.js文件

clean.js作用说明:由于app目录下放的是es6源文件,当执行时,会编译成es5,并放到server目录下。这时会有一个拷贝、复制到server目录下对应文件中;当文件发生更新都会进行拷贝、复制,这就会出现覆盖之前的文件,那么,就需要更新后先清空server目录,再复制;

//clean.js配置代码
import gulp from 'gulp';
import del from 'del';//删除的包
import args from './util/args';

gulp.task('clean',()=>{//创建一个clean任务
    //清除server/public和server/views下面的文件
    return del(['server/public','server/views'])
});
  • tasks目录下创建build.js文件

build.js作用说明:gulp在执行时,有一个默认的动作,就是需要一个default.js。但是在这之前,需要把每一个任务串起来,哪个任务先或后,谁依赖谁,这就需要一个build.js文件;

//build.js配置代码
//关联所有gulp创建的任务
import gulp from 'gulp'
import gulpSequence from 'gulp-sequence' //处理包的顺序
/*
* gulpSequence():处理包的顺序的方法
*('clean','css','pages','scripts',['browser','serve'])):按顺序写要执行的任务
* serve任务一定是在最后面执行的;
*/
gulp.task('build',gulpSequence('clean','css','pages','scripts',['browser','serve']));
  • tasks目录下创建default.js文件

default.js作用说明:gulp在执行时,有一个默认的动作,就是需要一个default.js,默认是打开这个文件的,所以需要一个defult.js文件;

//defult.js配置代码
//gulp的默认执行任务
import gulp from 'gulp';
//注册一个default任务
//没有这个任务,直接执行gulp会报错,所以一定要有default这个任务
gulp.task('default',['build']);
  • tasks目录下其它文件

css.js配置如下:

//css.js配置代码
import gulp from 'gulp';
import gulpif from 'gulp-if';
import livereload from 'gulp-livereload';//热更新
import args from './util/args';//命令行处理

gulp.task('css',()=>{
    return gulp.src('app/**/*.css')//打开要处理的所有css文件
        .pipe(gulp.dest('server/public'))//再扔到public文件中

        //监听是不是热更新----正常是需要写一个这样的,
        // 但是css直接放过来就好,不需要编译,所以不需要写这句
        // .pipe(gulpif(args.watch,livereload()))
});

pages.js配置如下:

//pages.js配置代码
//处理模版构建脚本
import gulp from 'gulp';
import gulpif from 'gulp-if';
import livereload from 'gulp-livereload';
import args from './util/args';

gulp.task('pages',()=>{
    return gulp.src('app/**/*.ejs')
        .pipe(gulp.dest('server'))//将所有ejs文件放到server中
        .pipe(gulpif(args.watch,livereload()))//监听是不是热更新
});

以上所有配置都完成后,就可以在命令行中启动gulp了,这时会有如下图的报错

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容