美文网首页
带你了解项目的自动化构建

带你了解项目的自动化构建

作者: WEB前端含光 | 来源:发表于2020-09-12 15:44 被阅读0次

    前言

    关于自动化构建

    中途如果遭遇挫折,运行失败,或者打退堂鼓,请直接查看 小结 部分,有我的 最终攻略

    除了第一节介绍的脚手架,自动化构建也是前端工程化中非常重要的组成部分。它使我们可以在开发环境中使用es6新特性、sass、模板引擎等高效率语法,自动转换为浏览器支持的特性,帮我们脱离开发环境兼容带来的问题,解决重复且无聊的操作。

    常用的自动化构建工具以及各自特点:

    npm scripts:是实现自动化构建工作流最简单的方式,简单的构建过程可以使用,复杂的不适应。
    grunt:工作过程基于临时文件(硬盘读写)实现,构建速度相对较慢。现在不常用了。
    gulp:基于内存实现,速度更快。常用。
    fis:大而全,将典型需求集中到了内部,可直接使用。

    npm scripts

    npm scripts 是实现自动化构建工作流最简单的方式

    简单演示:1.将src中的sass文件自动编译为css文件。2.启动一个服务器运行项目。 3.检测到scss文件变化,自动编译,编译后在自动更新到浏览器。



    下载依赖

    npm i sass --dev  //编译
    npm i browser-sync --dev  //启动服务器
    复制代码
    

    让项目先build,再serve

    // package.json
     "scripts": {
        "build": "sass scss/main.scss css/style.css ",
        "preserve": "npm run build",
        "serve": "browser-sync . "
      },
    复制代码
    

    让项目被自动检测:既要监测变化,又要启动服务器————需要同时执行多个任务,需要npm-run-all依赖 npm i npm-run-all --dev

    // package.json
     "scripts": {
        "build": "sass scss/main.scss css/style.css --watch",
        "serve": "browser-sync . --files \"css/*.css\"",
        "start": "run-p build serve"
      },
    复制代码
    

    grunt
    tips:了解,为看源码准备。目前用的不多

    基本使用

    初始化项目与下载依赖

    npm init --yes
    npm install grunt --dev
    复制代码
    

    根目录下创建gruntfile.js文件,常用api:registerTask设置任务

    // Grunt 的入口文件
    // 用于定义一些需要 Grunt 自动执行的任务
    // 需要导出一个函数
    // 此函数接收一个 grunt 的对象类型的形参
    // grunt 对象中提供一些创建任务时会用到的 API
    
    module.exports = grunt => {
      grunt.registerTask('bar', () => {
        console.log('other task')
      })
    
      // // default 是默认任务名称
      // // 通过 grunt 执行时可以省略
      // grunt.registerTask('default', () => {
      //   console.log('default task')
      // })
    
      // 第二个参数可以指定此任务的映射任务,
      // 这样执行 default 就相当于执行对应的任务
      // 这里映射的任务会按顺序依次执行,不会同步执行
      grunt.registerTask('default', ['foo', 'bar'])
    
    }
    
    复制代码
    

    运行 npx gulp 或者 npx gulp bar 测试

    插件

    插件机制:插件内部封装了通用的构建任务,不用自己手动设置。

    initConfig设置配置,loadNpmTasks加载插件(插件要install)

    grunt.initConfig({
        clean: {
          temp: 'temp/**'
        }
      })
      
    grunt.loadNpmTasks('grunt-contrib-clean')
    复制代码
    

    常用插件:- 运行 npx gulp 或者 npx gulp sass 等测试

    const sass = require('sass') //编译sass文件
    const loadGruntTasks = require('load-grunt-tasks') //自动加载插件
    
    module.exports = grunt => {
        grunt.initConfig({
            sass:{
                options: {
                    sourceMap: true,
                    implementation: sass
                },
                main:{
                    files :{
                        'dist/css/main.css':'src/scss/main.scss'
                    }
                }
            },
            babel: {
                options: {
                    sourceMap: true,
                    presets: ['@babel/preset-env']
                },
                main: {
                    files: {
                        'dist/js/app.js':'src/js/app.js'
                    }
                }
            },
            watch: {
                js: {
                    files: ['src/js/*.js'],
                    tasks: ['babel']
                },
                css: {
                    files: ['src/scss/*.scss'],
                    tasks: ['sass']
                }
            }
        }),
        // grunt.loadNpmTasks('grunt-contrib-clean')
        // grunt.loadNpmTasks('grunt-sass')
        loadGruntTasks(grunt) 
        grunt.registerTask('default',['sass','babel','watch'])
    }
    复制代码
    

    gulp
    最流行的前端构建框架,其核心特点是:高效、易用。

    基本使用:

    install gulp依赖——gulpfile.js文件,自定义构建任务——cli执行任务并测试

    //gulpfile.js
    // gulp 的任务函数都是异步的
    // 可以通过调用回调函数标识任务完成
    exports.foo = done => {
      console.log('foo task working~')
      done() // 标识任务执行完成
    }
    
    // default 是默认任务
    // 在运行是可以省略任务名参数
    exports.default = done => {
      console.log('default task working~')
      done()
    }
    复制代码
    

    集成案例

    样式编译 依赖:gulp-sass

    const style = () => {
      return src('src/assets/styles/*.scss', { base: 'src' })
        .pipe(plugins.sass({ outputStyle: 'expanded' }))
        .pipe(dest('temp'))
        .pipe(bs.reload({ stream: true }))
    }
    复制代码
    

    脚本编译 依赖:gulp-babel

    const script = () => {
      return src('src/assets/scripts/*.js', { base: 'src' })
        .pipe(plugins.babel({ presets: ['@babel/preset-env'] }))
        .pipe(dest('temp'))
        .pipe(bs.reload({ stream: true }))
    }
    
    复制代码
    

    模板文件编译 依赖:gulp-swig

    const page = () => {
      return src('src/*.html', { base: 'src' })
        .pipe(plugins.swig({ data, defaults: { cache: false } })) // 防止模板缓存导致页面不能及时更新
        .pipe(dest('temp'))
        .pipe(bs.reload({ stream: true }))
    }
    复制代码
    

    图片压缩 依赖:gulp-imagemin

    const image = () => {
      return src('src/assets/images/**', { base: 'src' })
        .pipe(plugins.imagemin())
        .pipe(dest('dist'))
    }
    复制代码
    

    public文件拷贝

    const extra = () => {
      return src('public/**', { base: 'public' })
        .pipe(dest('dist'))
    }
    复制代码
    

    热更新服务器

    const serve = () => {
      watch('src/assets/styles/*.scss', style)
      watch('src/assets/scripts/*.js', script)
      watch('src/*.html', page)
      // watch('src/assets/images/**', image)
      // watch('src/assets/fonts/**', font)
      // watch('public/**', extra)
      watch([
        'src/assets/images/**',
        'src/assets/fonts/**',
        'public/**'
      ], bs.reload)
    
      bs.init({
        notify: false,
        port: 2080,
        // open: false,
        // files: 'dist/**',
        server: {
          baseDir: ['temp', 'src', 'public'],
          routes: {
            '/node_modules': 'node_modules'
          }
        }
      })
    }
    复制代码
    

    node_modules build时 引用处理与压缩

    const useref = () => {
      return src('temp/*.html', { base: 'temp' })
        .pipe(plugins.useref({ searchPath: ['temp', '.'] }))
        // html js css
        .pipe(plugins.if(/\.js$/, plugins.uglify()))
        .pipe(plugins.if(/\.css$/, plugins.cleanCss()))
        .pipe(plugins.if(/\.html$/, plugins.htmlmin({
          collapseWhitespace: true,
          minifyCSS: true,
          minifyJS: true
        })))
        .pipe(dest('dist'))
    }
    复制代码
    

    清理 编译文件

    const clean = () => {
      return del(['dist', 'temp'])
    }
    复制代码
    

    微任务合并正好为常见任务

    const compile = parallel(style, script, page)
    
    // 上线之前执行的任务
    const build =  series(
      clean,
      parallel(
        series(compile, useref),
        image,
        font,
        extra
      )
    )
    
    const develop = series(compile, serve)
    复制代码
    

    fis
    概述

    主要特点是高度集成,将前端日常开发过程中常见的构建任务,还有调试任务都集中到了内部。不需要自定义任务,可以通过配置,使用内部任务,自动完成整个构建过程。但是也缺失了灵活性。

    简单使用

    npm install fis3 -g
    fis3 目录 -d 输出目录
    
    //fis-conf.js
    fis.match('*.{js,scss,png}',{
        release:'/assets/$0'
    })
    复制代码
    

    编译与压缩

    //fis-conf.js
    fis.match('**/*.scss',{
        rExt: '.css',
        parser:fis.plugin('node-sass'),
        optimizer:fis.plugin('clean-css')
    })
    fis.match('**/*.js',{
        rExt: '.js',
        parser:fis.plugin('babel-6.x'),
        optimizer:fis.plugin('uglify-js')
    })
    复制代码
    

    小结

    关于自动化构建项目,往小了说主要就是选择技术(gulp、grunt、fis...),然后去官网查询符合需求的插件,下载插件并按照文档要求配置后,运行命令行使用即可。 往大了说,使用过程中,还是会涉及很多其他相关的知识点的。仅凭一篇文章,肯定是难以掌握透彻。不过可以在脑海中先搭建好基本体系架构,了解其使用原理,在日常使用中,先简单尝试。碰见问题了,在逐一攻破,或者查找资料,最终一定能越来越清晰明了。

    一攻破,或者查找资料,最终一定能越来越清晰明了。

    最终攻略

    终极攻略就是, 遇到挫折别放弃,休息片刻继续走 。跟着文档练习的过程中,一定会出现一些问题,出现问题不可怕,一定要想办法解决它。我跟着视频课程一步一步的做,还经常出现各种问题,需要连线老师寻求帮助,有时候甚至还需要老师帮我看代码,语音通话一点一点的告诉我怎么改,才能解决呢。更何况你只是看着文档,所以有了问题不要害怕,实在不知道怎么办的时候,也可以来问我。(ps一句: 如果你公司有大佬,一定要多问大佬,如果没有,一定要想办法找到大佬。因为有时候他们的一句话,可能直接帮你避免一整天没有意义的找错 。)

    饮水思源,还是很感谢明教的老师的,太耐心了。好多时候我都不想看的时候,是他们帮我找到原因,推着我继续前进的,哈哈。好幸运能碰见你们,让我觉得报班不是糟践钱。

    再送一波福利给大家

    整理这个的是一些大企业的大佬,认真地和他们学习了很多经验以及获取了很多直观的资料,现在全部拿出来奉献给大家!

    想系统学习WEB前端的朋友,可以加这边的交流裙1146649671)学习资料、面试资料、视频资源,资源给你们拉满,不见不散哦~

    相关文章

      网友评论

          本文标题:带你了解项目的自动化构建

          本文链接:https://www.haomeiwen.com/subject/ylpwektx.html