• 10-webpack之plugin


    1、关于plugin
    什么是 plugin
    • plugin 是插件的意思,通常是用于对某个现有的架构进行扩展
    • webpack 中的插件,就是对 webpack 现有功能的各种扩展,比如打包优化,文件压缩等


    loader 和 plugin 区别
    • loader 主要用于转换某些类型的模块,它是一个转换器
    • plugin 是插件,它是对 webpack 本身的扩展,是一个扩展器

    plugin 的使用过程
    1. 通过 npm 安装需要使用的 plugins (某些 webpack 已经内置的插件不需要安装)
    2. 在 webpack.config.js 中的 plugins 中配置插件


    2、添加版权的plugin:BannerPlugin

    BannerPlugin 属于 webpack 自带的插件,可以为打包的文件添加版权声明


    修改 webpack.config.js 的文件:

    image


    重新打包程序,查看 bundle.js 文件的头部,可以看到如下信息:

    image


    3、打包html的plugin:HtmlWebpackPlugin

    目前,我们的 index.html 文件是存放在项目的根目录下的,但在真实发布项目时,发布的是 dist 文件夹中的内容,

    而 dist 文件夹中如果没有 index.html 文件,那么打包的 js 等文件也就没有意义了;


    所以,我们需要将 index.html 文件打包到 dist 文件夹中,这个时候可以使用 HtmlWebpackPlugin 插件;


    HtmlWebpackPlugin 插件可以为我们做这些事情:

    • 自动生成一个 index.html 文件(可以指定模板来生成)
    • 将打包的 js 文件,自动通过 script 标签插入到 body 中


    安装 HtmlWebpackPlugin 插件:

    npm install html-webpack-plugin@3.2.0 --save-dev


    修改 webpack.config.js 文件中 plugins:

    image


    需要删除(注释)之前在 output 中添加的 publicPath 属性 :

    image


    修改模板 index.html

    上面的 template 表示根据什么模板来生成 index.html,这里表示的是和 webpack.config.js 在同一目录的 index.html,由于 HtmlWebpackPlugin 插件会将打包的 js 文件,

    自动通过 script 标签插入到 body 中,所以我们要去掉模板 index.html 中的多余部分:

    image


    重新打包执行,会发现 dist 目录中多了一个 index.html 文件:

    image


    4、js压缩的Plugin:uglifyjs-webpack-plugin

    在项目发布之前,我们必然需要对 js 等文件进行压缩处理,

    对打包的js文件进行压缩,可以使用一个第三方的插件 uglifyjs-webpack-plugin,并且版本号指定 1.1.1,和 CLI2 保持一致,


    安装 uglifyjs-webpack-plugin:

    npm install uglifyjs-webpack-plugin@1.1.1 --save-dev


    配置:
    image


    重新打包后,查看bundle.js,已经被压缩了:
    image


    5、搭建本地服务器

    webpack 提供了一个可选的本地开发服务器,这个本地服务器基于 node.js 搭建,内部使用 express 框架,可以实现让浏览器自动刷新

    显示我们修改后的结果,不过它是一个单独的模块,在webpack中使用之前需要先安装它;


    安装 webpack-dev-serve:

    npm install --save-dev webpack-dev-server@2.9.1


    webpack.config.js 文件配置修改,:

    image


    devserver 也是作为 webpack 中的一个选项,选项本身可以设置如下属性:

    • contentBase:为哪一个文件夹提供本地服务,默认是根文件夹,我们这里要填写./dist
    • port:端口号
    • inline:页面实时刷新
    • historyApiFallback:在SPA页面中,依赖HTML5的history模式


    此时,可以通过命令:webpack-dev-server 启动服务器了


    配置 package.json 中的 scripts,简化启动服务器的命:

    image

    如果写为:  "dev": "webpack-dev-server –open"

    --open参数表示直接用默认浏览器打开


    执行命令 nmp run dev 启动服务器, 在浏览器中打开相应的URL即可:

    image


    搭建本地服务器用于开发阶段调试;


    6、webpack配置分离

    由于我们目前所有的生产环境代码和发布环境代码都写在 webpack.config.json 中,这样当我们在编译的时候,

    会将生产环境代码和发布环境代码一起编译,但有时候我们希望将二者分开编译;

    这时候,将生产环境代码和发布环境代码抽离出来显得很有必要


    新建一个文件夹 build,在 build 中新建三个文件:

    image


    base.config.js:公共部分配置

    const path = require('path')
    const webpack = require('webpack')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      entry: './src/main.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js',
        // publicPath: 'dist/'
      },
      module: {
        rules: [
          {
            test: /.css$/,
            // css-loader只负责将css文件进行加载
            // style-loader负责将样式添加到DOM中
            // 使用多个loader时, 是从右向左
            use: ['style-loader', 'css-loader']
          },
          {
            test: /.less$/,
            use: [{
              loader: "style-loader", // creates style nodes from JS strings
            }, {
              loader: "css-loader" // translates CSS into CommonJS
            }, {
              loader: "less-loader", // compiles Less to CSS
            }]
          },
          {
            test: /.(png|jpg|gif|jpeg)$/,
            use: [
              {
                loader: 'url-loader',
                options: {
                  // 当加载的图片, 小于limit时, 会将图片编译成base64字符串形式.
                  // 当加载的图片, 大于limit时, 需要使用file-loader模块进行加载.
                  limit: 13000,
                  name: 'img/[name].[hash:8].[ext]'
                },
              }
            ]
          },
          {
            test: /.js$/,
            // exclude: 排除
            // include: 包含
            exclude: /(node_modules|bower_components)/,
            use: {
              loader: 'babel-loader',
              options: {
                presets: ['es2015']
              }
            }
          },
          {
            test: /.vue$/,
            use: ['vue-loader']
          }
        ]
      },
      resolve: {
        extensions: ['.js', '.css', '.vue'],
        alias: {
          'vue$': 'vue/dist/vue.esm.js'
        }
      },
      plugins: [
        new webpack.BannerPlugin('最终版权归ming所有!'),
        new HtmlWebpackPlugin({
          template: 'index.html'
        }),
      ],
    }
    公共配置


    dev.config.js:开发部分配置

    module.exports = {
      devServer: {
        contentBase: './dist',  //服务监听的文件夹
        inline: true, //是否自动刷新
        port: 8888
      }
    }
    开发配置


    prod.config.js:生产部分配置

    const UglifyjswebpackPlugin = require('uglifyjs-webpack-plugin')
    
    module.exports = {
      plugins: [
        new UglifyjswebpackPlugin(),
      ],
    }
    
    生产配置


    安装对配置文件合并的插件:webpack-merge

    npm install webpack-merge --save-dev


    修改配置文件,添加合并配置:

    dev.config.js

    image


    prod.config.js

    image


    修改 package.json 文件,指定配置文件

    image


    在 base.config.js 中的 output 中的文件拼接路径是 'dist',表示的是从当前路径下拼接,也就是built/dist ,

    所以要改为../dist,不然打包的文件就会在built/dist 中了;

    image


    此时可以执行npm run build 或者npm run dev测试;

  • 相关阅读:
    开源图标字体 uiw-iconfont v1.2.6 发布,新增图标
    OAuth授权登录
    网站视觉设计规范
    LOGO有哪几种常规设计思路?
    Web设计规范----控件、组件
    前端工程师的新选择WebApp
    openstack学习-网络管理 (转)
    理解OpenStack与SDN控制器的集成(转)
    NFV MANO 架构
    Raid 磁盘阵列
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/13678973.html
Copyright © 2020-2023  润新知