美文网首页
构建工具/grunt/gulp/parcel/webpack

构建工具/grunt/gulp/parcel/webpack

作者: mao77_ | 来源:发表于2019-02-09 20:25 被阅读10次

    构建工具/grunt/gulp/parcel/webpack

    1. Grunt

    1.1 Grunt介绍

    • 中文主页 : http://www.gruntjs.net/

    • 是一套前端自动化构建工具,一个基于nodeJs的命令行工具

    • 它是一个任务运行器, 配合其丰富强大的插件

    • 常用功能:

      • 合并文件(js/css)
      • 压缩文件(js/css)
      • 语法检查(js)
      • less/sass预编译处理
      • 其它...
    • 安装nodejs, 查看版本

      node -v
      
    • 创建一个简单的应用grunt_test

      |- build----------构建生成的合并后文件所在的文件夹
      |- dist-----------构建生成的压缩文件所在的文件夹
      |- src------------源码文件夹
          |- js---------------js源文件夹
          |- less-------------less源文件夹
          |- index.html-----页面文件
      |- Gruntfile.js---grunt配置文件(注意首字母大写)
      |- package.json---项目包配置文件
          {
            "name": "grunt_test",
            "version": "1.0.0"   
          }
      
    • 全局安装 grunt-cli

      npm install -g grunt-cli 
      
    • 安装grunt

      npm install grunt --save-dev
      
    • 运行构建项目命令

      grunt  //提示 Warning: Task "default" not found
      

    1.2 配置文件: Gruntfile.js

    • 此配置文件本质就是一个node函数类型模块

    • 配置编码包含3步:

      1. 初始化插件配置
      2. 加载插件任务
      3. 注册构建任务
    • 基本编码:

      module.exports = function(grunt){
        // 1. 初始化插件配置
        grunt.initConfig({
            //主要编码处
        });
        // 2. 加载插件任务
        grunt.loadNpmTasks('grunt-contrib-concat');
        // 3. 注册构建任务
        grunt.registerTask('default', []);
      };
      
    • 命令: grunt //提示成功, 但没有任何效果(还没有使用插件定义任务)

    1.3 Grunt插件介绍

    • grunt官网的插件列表页面 http://www.gruntjs.net/plugins

    • 插件分类:

      • grunt团队贡献的插件 : 插件名大都以contrib-开头
      • 第三方提供的插件 : 大都不以contrib-开头
    • 常用的插件:

      • grunt-contrib-clean——清除文件(打包处理生成的)
      • grunt-contrib-concat——合并多个文件的代码到一个文件中
      • grunt-contrib-uglify——压缩js文件
      • grunt-contrib-jshint——javascript语法错误检查;
      • grunt-contrib-cssmin——压缩/合并css文件
      • grunt-contrib-htmlmin——压缩html文件
      • grunt-contrib-imagemin——压缩图片文件(无损)
      • grunt-contrib-copy——复制文件、文件夹
      • grunt-contrib-watch——实时监控文件变化、调用相应的任务重新执行
    • Gruntfile.js---grunt配置文件(注意首字母大写)(课堂配置)

      /*
        运行grunt指令,会去加载读取的配置文件
       */
      module.exports = function (grunt) {
        //此模块被调用时,会注入一个实参进来,要申明形参接受
        // 1. 初始化插件配置
        grunt.initConfig({
          babel: {        //配置任务名
            options: {    //配置选项
              sourceMap: false,
              presets: ['es2015']
            },
            dist: {
              files: [{
                expand:true,     //如果设为true,就表示下面文件名的占位符(即*号)都要扩展成具体的文件名。
                cwd:'src/',      //js目录下
                src:['**/*.js'], //所有js文件
                dest:'build/'    //输出到此目录下
              }]
            }
          },
          jshint: {
            options: {
              "curly": true,
              "eqnull": true,
              "eqeqeq": true,
              // "undef": true,
              "esversion": 6,
              "globals": {
                "jQuery": true
              }
            },
            all: ['Gruntfile.js','src/js/*.js']  //检查的所有文件
          },
          concat: {
            options: {
              separator: ';',     //连接符
            },
            dist: {
              src: ['build/js/module1.js', 'build/js/module2.js'], //指定要合并哪些文件
              dest: 'build/js/built.js',    //合并的文件输出哪去
            },
          },
          pkg: grunt.file.readJSON('package.json'),   //读取package.json文件
          uglify: {
            options: {
              banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
              '<%= grunt.template.today("yyyy-mm-dd") %> */'    //向压缩文件最上面添加一些注释信息
            },
            my_target: {
              files: {
                'dist/js/dist.min.js': ['build/js/built.js']
              }
            }
          },
          less: {    //将less文件编译成css文件,将编译后的文件合并成一个文件
            production: {
              options: {
                paths: ['build/css'],
                plugins: [
                  new (require('less-plugin-autoprefix'))({browsers: ["last 2 versions", "> 5%", "Firefox > 20", "ie 6-8"]})
                ]
              },
              files: {
                'build/css/built.css': 'src/less/*.less'
              }
            }
          },
          cssmin: {
            options: {
              mergeIntoShorthands: false,   //禁止合并css属性
              roundingPrecision: false     //不去四舍五入
            },
            target: {
              files: {
                'dist/css/dist.min.css': ['build/css/built.css']
              }
            }
          },
          htmlmin: {
            dist: {
              options: {
                removeComments: true,       //移除注释
                collapseWhitespace: true    //移除多余的空格
              },
              files: {
                'dist/index.html': 'src/index.html'
              }
            }
          },
          watch: {
            scripts: {    //监视js文件
              files: ['src/js/*.js'],  //监视的文件
              tasks: ['jshint', 'babel', 'concat', 'uglify'],       //一旦监视的文件发生改变,就会自动执行任务列表中的任务
              options: {
                spawn: false  //加快任务速度
              },
            },
            css: {
              files: 'src/less/*.less',
              tasks: ['less', 'cssmin'],
              options: {
                spawn: false  //加快任务速度
              },
            },
            html: {
              files: 'src/index.html',
              tasks: ['htmlmin'],
              options: {
                spawn: false  //加快任务速度
              },
            },
          },
        });
        // 2. 加载插件任务
        grunt.loadNpmTasks('grunt-babel');
        grunt.loadNpmTasks('grunt-contrib-jshint');
        grunt.loadNpmTasks('grunt-contrib-concat');
        grunt.loadNpmTasks('grunt-contrib-uglify');
        grunt.loadNpmTasks('grunt-contrib-less');
        grunt.loadNpmTasks('grunt-contrib-cssmin');
        grunt.loadNpmTasks('grunt-contrib-htmlmin');
        grunt.loadNpmTasks('grunt-contrib-watch');
        // 3. 注册构建任务
        grunt.registerTask('default', ['jshint', 'babel', 'concat', 'uglify', 'less', 'cssmin', 'htmlmin']);  //执行顺序从左到右,同步的
        grunt.registerTask('myWatch', ['default', 'watch']);
        
      };
      
    • 命令:

      grunt myWatch   //控制台提示watch已经开始监听, 修改保存后自动编译处理
      

    2. Gulp

    2.1 Gulp介绍

    • 中文主页: http://www.gulpjs.com.cn/

    • gulp是与grunt功能类似的前端项目构建工具, 也是基于Nodejs的自动任务运行器

    • 能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的
      合并、压缩、检查、监听文件变化、浏览器自动刷新、测试等任务

    • gulp更高效(异步多任务), 更易于使用, 插件高质量

    • 安装 nodejs, 查看版本: node -v

    • 创建一个简单的应用gulp_test

      |- dist
      |- build
      |- src
        |- js
        |- less
        |- css
      |- index.html
      |- gulpfile.js-----gulp配置文件
      |- package.json
        {
          "name": "gulp_test",
          "version": "1.0.0"
        } 
      
    • 安装gulp:

      • 全局安装gulp
        npm install gulp -g
        
      • 局部安装gulp
        npm install gulp --save-dev
        
      • 配置编码: gulpfile.js
        //引入gulp模块
        var gulp = require('gulp');
        //定义默认任务
        gulp.task('任务名', function() {
          // 将你的任务的任务代码放在这
        });
        gulp.task('default', ['任务'])//异步执行
        
      • 构建命令:
        gulp
        

    2.2 使用gulp插件

    • 相关插件:
      • gulp-concat : 合并文件(js/css)
      • gulp-uglify : 压缩js文件
      • gulp-rename : 文件重命名
      • gulp-less : 编译less
      • gulp-clean-css : 压缩css
      • gulp-livereload : 实时自动编译刷新
    • 重要API
      • gulp.src(filePath/pathArr) :
        • 指向指定路径的所有文件, 返回文件流对象
        • 用于读取文件
      • gulp.dest(dirPath/pathArr)
        • 指向指定的所有文件夹
        • 用于向文件夹中输出文件
      • gulp.task(name, [deps], fn)
        • 定义一个任务
      • gulp.watch()
        • 监视文件的变化
    • 处理js
      • 创建js文件
        • src/js/test1.js
          (function () {
            function add(num1, num2) {
              return num1 + num2;
            }
            console.log(add(10, 30));
          })();
          
        • src/js/test2.js
          (function () {
            var arr = [2,3,4].map(function (item, index) {
                return item+1;
            });
            console.log(arr);
          })();
          
      • 下载插件:
        npm install jshint gulp-jshint gulp-concat gulp-uglify gulp-rename babel-core babel-preset-es2015 gulp-babel --save-dev
        
      • 配置编码
        //引入gulp模块
        const gulp = require('gulp');
        const jshint = require('gulp-jshint');
        const babel = require('gulp-babel');
        const concat = require('gulp-concat');
        const uglify = require('gulp-uglify');
        const rename = require("gulp-rename");
        
        //定义默认任务
        gulp.task('jslint', function() {
          // 将你的任务的任务代码放在这
          return gulp.src('.src/js/*.js')
            .pipe(jshint())
            .pipe(jshint.reporter('default'));
        });
        
        gulp.task('babel', ['jslint'], function () {
          return gulp.src('src/js/*.js')
            .pipe(babel({
              presets: ['es2015']
            }))
            .pipe(gulp.dest('build/js'))
        });
        
        gulp.task('minifyjs', ['babel'], function () {
          return gulp.src('build/js/*.js')
            .pipe(concat('built.js'))
            .pipe(gulp.dest('build/js'))
            .pipe(uglify())
            .pipe(rename('dist.min.js'))
            .pipe(gulp.dest('dist/js'))
        });
        
        //注册执行任务
        gulp.task('default', ['minifyjs'])//异步执行
        
      • 页面引入js浏览测试 : index.html
        <script type="text/javascript" src="dist/js/dist.min.js"></script>
        
      • 打包测试: gulp
    • 处理css
      • 创建less文件
        • src/less/test1.less
          #box1{
            width: 100px;
            height: 150px;
            background: pink;
            p {
              color: #fff;
              font-size: 30px;
            }
          }
          
        • src/less/test2.less
          #box2{
            width: 200px;
            height: 200px;
            background: deeppink;
            p {
              color: deepskyblue;
              display: flex;
            }
          }
          
      • 下载插件:
        npm install gulp-less gulp-clean-css --save-dev 
        
      • 配置编码
        const less = require('gulp-less');
        const LessAutoprefix = require('less-plugin-autoprefix');
        const autoprefix = new LessAutoprefix({ browsers: ['last 2 versions'] });
        const cleanCSS = require('gulp-clean-css');
        
        gulp.task('less', function () {
          return gulp.src('src/less/*.less')
            .pipe(less({
              plugins: [autoprefix]
            }))
            .pipe(gulp.dest('build/css'))
        });
        
        gulp.task('css', ['less'], function () {
          return gulp.src('build/css/*.css')
            .pipe(concat('dist.min.css'))
            .pipe(cleanCSS({compatibility: 'ie8'}))
            .pipe(gulp.dest('dist/css'))
        });
        
        gulp.task('default', ['minifyjs', 'css']);
        
      • 页面引入css浏览测试 : index.html
        <link rel="stylesheet" href="dist/css/dist.min.css">
        <div id="box1"><p>hello</p></div>
        <div id="box2"><p>atguigu</p></div>
        
      • 打包测试: gulp
    • 处理html
      • 下载插件:
        npm install gulp-htmlmin --save-dev
        
      • 配置编码
        var htmlmin = require('gulp-htmlmin');
        //压缩html任务
        gulp.task('html', function() {
          return gulp.src('index.html')
            .pipe(htmlmin({collapseWhitespace: true, removeComments: true}))
            .pipe(gulp.dest('dist'))
        });
        gulp.task('default', ['minifyjs', 'css', 'html']);
        
      • 修改页面引入
        <link rel="stylesheet" href="css/dist.min.css">
        <script type="text/javascript" src="js/dist.min.js"></script>
        
      • 打包测试: gulp
    • 自动编译
      • 下载插件

        npm install gulp-livereload --save-dev
        
      • 配置编码:

        var livereload = require('gulp-livereload');
                  
        //所有的pipe
        .pipe(livereload());
        
        gulp.task('watch', ['default'], function () {    
          //开启监视
          livereload.listen();
          //监视指定的文件, 并指定对应的处理任务
          gulp.watch('src/js/*.js', ['minifyjs'])
          gulp.watch(['src/css/*.css','src/less/*.less'], ['cssTask','lessTask']);
        });
        
      • 热加载(实时加载)

        • 下载插件:gulp-connect
        1、 npm install gulp-connect --save-dev
        2、 注册 热加载的任务 server,注意依赖build任务 
        3、注册热加载的任务
            //配置加载的选项
            connect.server({
                  root : 'dist/',//提供服务的根路径
                  livereload : true,//是否实时刷新
                  port : 5000//开启端口号
             });
             // 自动开启链接
             open('http://localhost:5000');//npm install open --save-dev
             // 监视目标文件
            gulp.watch('src/js/*.js', ['js']);
            gulp.watch(['src/css/*.css', 'src/css/*.less'], ['cssMin', 'less']);
        

    2.3 扩展

    • 打包加载gulp插件
    • 前提:将插件下载好。
    • 下载打包插件: gulp-load-plugins
    • npm install gulp-load-plugins --save-dev
    • 引入: var $ = require('gulp-load-plugins')();!!!引入的插件是个方法,必须记住调用。
    • 神来之笔:其他的插件不用再引入了
    • 使用方法:
      * 所有的插件用 $ 引出,其他插件的方法名统一为插件的功能名字(即插件名字的最后一部分):如:concat,connect,cssmin...
      gulp.task('lib', function() {
        gulp.src('bower_components/**/*.js')
        .pipe(gulp.dest(app.devPath + 'vendor'))
        .pipe(gulp.dest(app.prdPath + 'vendor'))
        .pipe($.connect.reload());
      });
      
      

    2.4 gulpfile.js(课堂配置)

    //引入gulp模块
    const gulp = require('gulp');
    const $ = require('gulp-load-plugins')();
    /*const jshint = require('gulp-jshint');
    const babel = require('gulp-babel');
    const concat = require('gulp-concat');
    const uglify = require('gulp-uglify');
    const rename = require("gulp-rename");
    const less = require('gulp-less');*/
    const LessAutoprefix = require('less-plugin-autoprefix');
    const autoprefix = new LessAutoprefix({ browsers: ['last 2 versions'] });
    /*const cssmin = require('gulp-cssmin');
    const htmlmin = require('gulp-htmlmin');
    const livereload = require('gulp-livereload');
    const connect = require('gulp-connect');*/
    const open = require('open');
    const opn = require('opn');  //可以自动开启游览器
    /*
      任务如果指定了 return  那么这个任务就是个异步的任务
          如果没有指定 return  那么这个任务就是个同步的任务
     */
    //定义默认任务
    /*gulp.task('jshint', function() {
      // 将你的任务的任务代码放在这
      return gulp.src('./src/js/!*.js')    //将指定目录下的文件以数据流的方式导入到gulp内存中
        .pipe(jshint({esversion: 6}))    //检查js语法错误
        .pipe(jshint.reporter('default'));  //使用默认的错误提示
    });
    
    gulp.task('babel', ['jshint'], function () {   //中间数组作用:先执行数组中的任务,在执行本身的任务
      return gulp.src('./src/js/!*.js')
        .pipe(babel({       //语法转换 es6-es5
          presets: ['es2015']
        }))
        .pipe(gulp.dest('build/js'))  //将gulp内存中的数据流输出指定目录下
    })
    
    gulp.task('concat', ['babel'], function () {
      return gulp.src(['./build/js/module1.js', './build/js/module2.js'])
        .pipe(concat('built.js'))   //合并所有js文件并命名
        .pipe(gulp.dest('./build/js'))
    })
    
    gulp.task('uglify', ['concat'], function () {
      return gulp.src('./build/js/built.js')
        .pipe(uglify())     //压缩js代码
        .pipe(rename('dist.min.js'))   //重命名js文件
        .pipe(gulp.dest('./dist/js/'))
    })*/
    // 检查语法错误 -- 进行语法转换 -- 合并js文件 -- 压缩js文件
    gulp.task('minifyjs', function () {
      return gulp.src('./src/js/*.js')
        .pipe($.jshint({esversion: 6}))    //检查js语法错误
        .pipe($.jshint.reporter('default'))  //使用默认的错误提示
        .pipe($.babel({       //语法转换 es6-es5
            presets: ['es2015']
        }))
        .pipe(gulp.dest('build/js'))
        .pipe($.concat('built.js'))   //合并所有js文件并命名
        .pipe(gulp.dest('./build/js'))
        .pipe($.uglify())     //压缩js代码
        .pipe($.rename('dist.min.js'))   //重命名js文件
        .pipe(gulp.dest('dist/js'))
        .pipe($.livereload())
    })
    
    gulp.task('minifycss', function () {
      return gulp.src('src/less/*.less')
        .pipe($.less({          //将less文件编译成css文件
          plugins: [autoprefix]  //增加前缀
        }))
        .pipe(gulp.dest('build/css'))
        .pipe($.concat('built.css'))   //合并css文件
        .pipe(gulp.dest('build/css'))
        .pipe($.cssmin())   //压缩css
        .pipe($.rename('dist.min.css'))
        .pipe(gulp.dest('./dist/css'))
        .pipe($.livereload())
    })
    
    gulp.task('minifyhtml', function () {
      return gulp.src('src/index.html')
        .pipe($.htmlmin({
          removeComments: true,
          collapseWhitespace: true
        }))
        .pipe(gulp.dest('dist'))
        .pipe($.livereload())
    })
    
    gulp.task('watch', ['default'], function () {
      $.livereload.listen();
      //配置热更新/热加载
      $.connect.server({
        root: 'dist',   //访问目录
        livereload: true,
        port: 3000
      });
      //打开网页
      opn('http://localhost:3000');
      //配置监视任务
      gulp.watch('./src/js/*.js', ['minifyjs'])
      gulp.watch('./src/less/*.less', ['minifycss'])
      gulp.watch('./src/index.html', ['minifyhtml'])
    })
    
    gulp.task('default', ['minifyjs', 'minifycss', 'minifyhtml'])//异步执行
    

    3. parcel

    快速、零配置的 Web 应用程序打包器

    目前,Parcel 构建速度快,但 Parcel 输出文件大

    Parcel 内置了一个开发服务器,这会在你更改文件时自动重建你的应用程序,并支持模块热替换 ,以便你快速开发。你只需指定入口文件即可:

    parcel index.html -p 3000
    

    中文主页: http://www.css88.com/doc/parcel/

    4. webpack快速入门教程

    1、了解Webpack相关

    * 什么是webpack
        * Webpack是一个模块打包器(bundler)。
        * 在Webpack看来, 前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理
        * 它将根据模块的依赖关系进行静态分析,生成对应的静态资源
    * 四个核心概念
        * Entry:入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。
        * Output:output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。
        * Loader:loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只能解析 JavaScript)。
        * Plugins:插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量等。
    * 理解Loader
        * Webpack 本身只能加载JS/JSON模块,如果要加载其他类型的文件(模块),就需要使用对应的loader 进行转换/加载
        * Loader 本身也是运行在 node.js 环境中的 JavaScript 模块
        * 它本身是一个函数,接受源文件作为参数,返回转换的结果
        * loader 一般以 xxx-loader 的方式命名,xxx 代表了这个 loader 要做的转换功能,比如 json-loader。
    * 理解Plugins
        * 插件件可以完成一些loader不能完成的功能。
        * 插件的使用一般是在 webpack 的配置信息 plugins 选项中指定。
        * CleanWebpackPlugin: 自动清除指定文件夹资源
        * HtmlWebpackPlugin: 自动生成HTML文件并
        * UglifyJSPlugin: 压缩js文件
    * 配置文件(默认)
        * webpack.config.js : 是一个node模块,返回一个 json 格式的配置信息对象
    

    2、学习文档 :

    3、开启项目

    • 初始化项目:
        • 生成package.json文件
        {
          "name": "webpack_test",
          "version": "1.0.0"
        } 
        
    • 安装webpack
    • npm install webpack -g //全局安装
    • npm install webpack --save-dev //局部安装

    4、编译打包应用

    • 创建入口src/js/ : entry.js
    • document.write("entry.js is work");
    • 创建主页面: dist/index.html
      • <script type="text/javascript" src="bundle.js"></script>
    • 编译js
      • webpack src/js/entry.js dist/bundle.js
    • 查看页面效果

    5、添加js/json文件

    * 创建第二个js: src/js/math.js
        ``` 
        export function square(x) {
          return x * x;
        }
        
        export function cube(x) {
          return x * x * x;
        }
        ```
    * 创建json文件: src/json/data.json
        ```
        {
          "name": "Tom",
          "age": 12
        }
        ```
    * 更新入口js : entry.js
        ```
        import {cube} from './math'
        import data from '../json/data.json'
        //注意data会自动被转换为原生的js对象或者数组
        document.write("entry.js is work <br/>");
        document.write(cube(2) + '<br/>');
        document.write(JSON.stringify(data) + '<br/>')
        ```
    * 编译js:
        ```
        webpack src/js/entry.js dist/bundle.js
        ```
    * 查看页面效果
    

    6、使用webpack配置文件

    * 创建webpack.config.js
        ```
        const path = require('path'); //path内置的模块,用来设置路径。
        
        module.exports = {
          entry: './src/js/entry.js',   // 入口文件
          output: {                     // 输出配置
            filename: 'bundle.js',      // 输出文件名
            path: path.resolve(__dirname, 'dist')   //输出文件路径配置
          }
        };
        ```
    * 配置npm命令: package.json
        ```
        "scripts": {
          "build": "webpack"
        },
        ```
    * 打包应用
        ```
        npm run build
        ```
    

    7、打包css和图片文件

    • 安装样式的loader
    ```
    npm install css-loader style-loader --save-dev
    npm install file-loader url-loader --save-dev
    补充:url-loader是对象file-loader的上层封装,使用时需配合file-loader使用。
    ```
    
    • 配置loader

      module: {
        rules: [
          {
            test: /\.css$/,
            use: [
              'style-loader',
              'css-loader'
            ]
          },
          {
            test: /\.(png|jpg|gif)$/,
            use: [
              {
                loader: 'url-loader',
                options: {
                  outputPath: 'images/', //决定输出文件的位置
                  publicPath: '../images/',
                  limit: 8 * 1024,  // 8kb大小以下的图片文件都用base64处理
                }
              }
            ]
          }
        ]
      }
      
    • 向应用中添加2张图片:

      • 小图: img/logo.png
      • 大图: img/big.jpg
    • 创建样式文件: src/css/test.css

      body {
        background: url('../img/logo.jpg')
      }
      
    • 更新入口js : entry.js

    • import '../css/test.css'
    • 添加css样式

      box1{

        width: 300px;
        height: 300px;
        background-image: url("../image/logo.jpg");
      }
      #box2{
        width: 300px;
        height: 300px;
        background-image: url("../image/big.jpg");
      }
      
    • index.html添加元素

      <div id="box1"></div>
      <div id="box2"></div>

    • 执行打包命令:

      npm run build
      

    8、优化css

    将style样式改为link标签引入css
    * 安装插件
        npm install --save-dev extract-text-webpack-plugin
    * 引入插件(插件都需要引入)
        const ExtractTextPlugin = require("extract-text-webpack-plugin")
    * 配置Plugins
        plugins: [
         new ExtractTextPlugin({
           filename: 'css/[name].css'
         })
        ]
    * 修改loader
        {
          test: /\.css$/,
          use: ExtractTextPlugin.extract({
            fallback: "style-loader",
            use: 'css-loader'
          })
        }
    

    9、打包html文件

    将html文件也打包过去
    * 安装插件
        npm install --save-dev clean-webpack-plugin
    * 引入插件(插件都需要引入)
        const CleanWebpackPlugin = require('clean-webpack-plugin')
    * 配置Plugins
        new HtmlWebpackPlugin({   //html加载
          filename: 'index.html',
          template: 'src/index.html',
        })
    

    10、清除打包文件

    打包时将之前的文件夹清空,防止之前的文件干扰
    * 安装插件
        npm install --save-dev html-webpack-plugin
    * 引入插件(插件都需要引入)
        const HtmlWebpackPlugin = require('html-webpack-plugin');
    * 配置Plugins
        new CleanWebpackPlugin('build', {
          root: path.resolve(__dirname, '../')
        })
    

    以上就是build环境下的设置,可以生成打包后的文件
    命令配置 "build" : "webpack --config webpack.config.build.js"

    11、自动编译打包

    * 利用webpack开发服务器工具: webpack-dev-server@2
    * 下载
        - npm install --save-dev webpack-dev-server
    * webpack配置
          devServer:{//配置此静态文件服务器,可以用来预览打包后项目
            contentBase: path.resolve(__dirname, 'dist'), //开发服务运行时的文件根目录
            host: 'localhost', //主机地址
            port: 8080,  //端口号
            open: true  //是否自动打开浏览器
          }
    * 命令配置
        - "dev": "webpack-dev-server --config webpack.config.dev.js"
    * 编译打包应用并运行
        - npm run dev
    

    以上就是dev环境下的设置,可以自动在内存中生成打包后的文件并打开网页检查效果,有热更新功能。

    12、扩展css前缀

    * 下载
        npm install --save-dev postcss-loader
    * 配置文件
        * 文件名: postcss.config.js
        * 内容:
            module.exports = {
              "plugins": {
                "autoprefixer": {
                  "browsers": [
                    "ie >= 8",
                    "ff >= 30",
                    "chrome >= 34",
                    "safari >= 7",
                    "opera >= 23"
                  ]
                }
              }
            }
    
    * 修改loader
        {
          test: /\.css$/,
          use: ExtractTextPlugin.extract({
            fallback: "style-loader",
            use: ['css-loader', 'postcss-loader']
          })
        }
    

    13、压缩css

    * 修改loader
        {
          test: /\.css$/,
          use: ExtractTextPlugin.extract({
            fallback: "style-loader",
            use: [{
              loader: 'css-loader',
              options: {
                minimize: true  //css压缩
              }
            }, 'postcss-loader',]
          })
        }
    

    14、JS语法转化

    * 下载
        npm install --save-dev babel-core babel-loader babel-preset-es2015
    * 修改loader
        {
          test: /\.js$/,
          exclude: /node_modules/, //忽略文件
          loader: 'babel-loader',
          query: {
            presets: [
              require.resolve('babel-preset-es2015')
            ]
          }
        }
    

    15、JShint检测

    * 下载
        npm install --save-dev jshint jshint-loader
    * 修改loader
        {
        test: /\.js$/, // 涵盖 .js 文件
        enforce: "pre", // 预先加载好 jshint loader
        exclude: /node_modules/, // 排除掉 node_modules 文件夹下的所有文件
        use: [{
          loader: "jshint-loader",
          options: {
            // 查询 jslint 配置项,请参考 http://www.jshint.com/docs/options/
            // 例如
            camelcase: true,
            //jslint 的错误信息在默认情况下会显示为 warning(警告)类信息
            //将 emitErrors 参数设置为 true 可使错误显示为 error(错误)类信息
            emitErrors: true,
            //jshint 默认情况下不会打断webpack编译
            //如果你想在 jshint 出现错误时,立刻停止编译
            //请设置 failOnHint 参数为true
            failOnHint: true,
            esversion: 6
          }
        }
    

    16、压缩JS

    * 下载
        npm install --save-dev uglifyjs-webpack-plugin
    * 引入plugins
        const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
    * 配置plugins
        new UglifyJsPlugin()
    

    17、压缩html

    * 修改plugins
        new HtmlWebpackPlugin({   //html加载及压缩
          filename: 'index.html',
          template: './src/index.html',
          minify: {
            removeComments: true,
            collapseWhitespace: true
          }
        })
    

    以上就是prod环境下的设置,可以生成打包、压缩、语法转换等的文件
    命令配置 "prod" : "webpack --config webpack.config.prod.js"

    5. webpack附加

    5.1 - webpack.config.build.js

    /*
      webpack的配置文件,当你执行webpack默认找到配置文件webpack.config.js
      
      通过 webpack --display-modules 能查看所有任务执行情况
     */
    const {resolve} = require('path');
    //提取css成单独的文件
    const ExtractTextPlugin = require("extract-text-webpack-plugin");
    //创建一个html文件
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    //清除指定目录
    const CleanWebpackPlugin = require('clean-webpack-plugin');
    module.exports = {
      //入口
      entry: './src/js/app.js',
      //输出
      output: {
        path: resolve(__dirname, '../build'),   //输出目录
        filename: './js/built.js'            //输出文件名
      },
      //配置loader
      module: {
        rules: [
        /*  {     //配置规则
          test: /\.less$/,   //规则处理的文件
          use: [{            //遇到要处理的文件,通过use中的loader处理指定文件(执行顺序从右往左)
            loader: "style-loader" // 会在html文件中,将js中css样式生成一个style标签插入页面中去
          }, {
            loader: "css-loader" // 将css变成js中一个模块(commonjs的模块化语法)
          }, {
            loader: "less-loader" // 将less编译成css
          }]
        },*/
          {
            test: /\.less$/,
            use: ExtractTextPlugin.extract({
              fallback: 'style-loader',
              //如果需要,可以在 less-loader 之前将 resolve-url-loader 链接进来
              use: ['css-loader', 'less-loader']
            })
          },
          /*{
            test: /\.(png|jpg|gif)$/,
            use: [
              {
                loader: 'file-loader',
                options: {
                  publicPath: './build/images',  //样式中图片的路径
                  outputPath: './images'   //输出的文件路径
                }
              }
            ]
          }*/
          {
            test: /\.(png|jpg|gif)$/,
            use: [
              {
                loader: 'url-loader',
                options: {
                  limit: 8192,   // 8 * 1024  8kb大小以下的图片转化为base64格式
                  publicPath: '../images',  //样式中图片的路径
                  outputPath: './images'   //输出的文件路径
                }
              }
            ]
          }
        ]
      },
      //配置插件
      plugins: [
        new ExtractTextPlugin("./css/built.css"),
        new HtmlWebpackPlugin({
          filename: 'index.html',     //文件名
          template: 'src/index.html'  //以指定html文件为模板去创建html文件
        }),
        new CleanWebpackPlugin('../build', {  //不遵循output输出目录
          allowExternal: true   //允许清除根目录以外的文件夹
        })
      ],
      devtool: 'inline-source-map'
    }
    

    5.2 - webpack.config.dev.js

    /*
      webpack的配置文件,当你执行webpack默认找到配置文件webpack.config.js
      
      通过 webpack --display-modules 能查看所有任务执行情况
     */
    const {resolve} = require('path');
    //提取css成单独的文件
    const ExtractTextPlugin = require("extract-text-webpack-plugin");
    //创建一个html文件
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    //清除指定目录
    const CleanWebpackPlugin = require('clean-webpack-plugin');
    const webpack = require('webpack');
    module.exports = {
      //入口
      entry: ['./src/js/app.js', './src/index.html'],  //刷新了html页面
      //输出
      output: {
        path: resolve(__dirname, '../build'),   //输出目录
        filename: './js/built.js'            //输出文件名
      },
      //配置loader
      module: {
        rules: [
          {     //配置规则
            test: /\.less$/,   //规则处理的文件
            use: [{            //遇到要处理的文件,通过use中的loader处理指定文件(执行顺序从右往左)
              loader: "style-loader" // 会在html文件中,将js中css样式生成一个style标签插入页面中去
            }, {
              loader: "css-loader" // 将css变成js中一个模块(commonjs的模块化语法)
            }, {
              loader: "less-loader" // 将less编译成css
            }]
          },
          {
            test: /\.(png|jpg|gif)$/,
            use: [
              {
                loader: 'url-loader',
                options: {
                  limit: 8192,   // 8 * 1024  8kb大小以下的图片转化为base64格式
                  publicPath: '../images',  //样式中图片的路径
                  outputPath: './images'   //输出的文件路径
                }
              }
            ]
          },
          {
            test: /\.html$/,
            use: ['html-loader']
          }
        ]
      },
      //配置插件
      plugins: [
        new HtmlWebpackPlugin({
          filename: 'index.html',     //文件名
          template: 'src/index.html'  //以指定html文件为模板去创建html文件
        }),
        new webpack.NamedModulesPlugin(),
        new webpack.HotModuleReplacementPlugin()
      ],
      //服务器实现热更新
      devServer: {
        contentBase: __dirname,
        compress: true,   //以gzip格式压缩
        port: 3000,       //端口号
        open: true,       //自动打开网页
        hot: true         //开启热模替换功能
      }
    }
    

    5.3 - webpack.config.prod.js

    /*
      webpack的配置文件,当你执行webpack默认找到配置文件webpack.config.js
      
      通过 webpack --display-modules 能查看所有任务执行情况
     */
    const {resolve} = require('path');
    //提取css成单独的文件
    const ExtractTextPlugin = require("extract-text-webpack-plugin");
    //创建一个html文件
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    //清除指定目录
    const CleanWebpackPlugin = require('clean-webpack-plugin');
    //压缩js
    const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
    module.exports = {
      //入口
      entry: './src/js/app.js',
      //输出
      output: {
        path: resolve(__dirname, '../dist'),   //输出目录
        filename: './js/[name].[hash:7].js'            //输出文件名
      },
      //配置loader
      module: {
        rules: [
          {
            test: /\.less$/,
            use: ExtractTextPlugin.extract({
              fallback: 'style-loader',
              //如果需要,可以在 less-loader 之前将 resolve-url-loader 链接进来
              use: [{
                loader: 'css-loader',
                options: {
                  minimize: true //启用压缩css
                }
              }, 'postcss-loader', 'less-loader']
            })
          },
          {
            test: /\.(png|jpg|gif)$/,
            use: [
              {
                loader: 'url-loader',
                options: {
                  limit: 8192,   // 8 * 1024  8kb大小以下的图片转化为base64格式
                  publicPath: '../images',  //样式中图片的路径
                  outputPath: './images'   //输出的文件路径
                }
              }
            ]
          },
          {
            test: /\.js$/, // 涵盖 .js 文件
            enforce: "pre", // 预先加载好 jshint loader
            exclude: /node_modules/, // 排除掉 node_modules 文件夹下的所有文件
            use: [{
              loader: "jshint-loader",
              options: {
                // 查询 jslint 配置项,请参考 http://www.jshint.com/docs/options/
                // 例如
                camelcase: true,
                //jslint 的错误信息在默认情况下会显示为 warning(警告)类信息
                //将 emitErrors 参数设置为 true 可使错误显示为 error(错误)类信息
                emitErrors: true,
                //jshint 默认情况下不会打断webpack编译
                //如果你想在 jshint 出现错误时,立刻停止编译
                //请设置 failOnHint 参数为true
                failOnHint: true,
                esversion: 6
              }
            }]
          },
          {
            test: /\.js$/,
            exclude: /(node_modules|bower_components)/,
            use: {
              loader: 'babel-loader',
              options: {
                presets: ['es2015']
              }
            }
          }
        ]
      },
      //配置插件
      plugins: [
        new ExtractTextPlugin("./css/[name].[hash:7].css"),
        new HtmlWebpackPlugin({
          filename: 'main.[hash:7].html',     //文件名
          template: 'src/index.html',  //以指定html文件为模板去创建html文件
          minify: {                   //压缩html
            collapseWhitespace: true,
            removeComments: true
          }
        }),
        new CleanWebpackPlugin('../dist', {  //不遵循output输出目录
          allowExternal: true   //允许清除根目录以外的文件夹
        }),
        new UglifyJsPlugin()
      ],
    }
    

    相关文章

      网友评论

          本文标题:构建工具/grunt/gulp/parcel/webpack

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