webpack(一)

147 阅读4分钟

webpack 默认用法

  • yarn init -y
  • yarn add webpack webpack-cli --dev
  • 执行yarn webpack 会自动找到node_modules
  • bin目录的webpack命令
  • 自动打包src下面的index.js

webpack 简单配置

webpack.config.js 可以导出对象,数组, 函数。

// nodejs path方法。拼接路径
const path = require('path');
// 导出一个对象
module.exports = {
  entry: './src/index.js', // 打包js入口
  output: { // 打包js出口
    filename: 'bundle.js', // 打包js名字
    path: path.join(__dirname, 'output')  // 路径
  }
}

mode警告

  • production: 启动优化打包结果。
  • development: 优化打包的速度。
  • none: 不启动打包之外的任何操作。
module.exports = {
  mode: 'production' // 默认production 还可以是 development || none
};

loader

  • webpack内置是对js模块的打包。loader是对webpack功能的扩展。对不同模块进行处理。同时也可以再对js做更深一步的处理。 loader: 写在module对象下面的rules数组里面。每个元素是一个对象。里面有两个属性。每个对象对应着对某个模块的处理 我们根据test: 正则匹配模块。use:Array | Array | string: 表示使用哪个插件。
module.exports = {
 module: { // object
 	rules: [ // Array<obj>
    	.....
  		{ loader: 'style-loader' },
        {
          loader: 'css-loader', // 需要使用的插件。
          options: { // 插件需要的配置。
            modules: true
          }
        }
    ]
 }
};

将所有css import 页面需要的js里面

文件资源文件加载器 -- file-loader

js模块在处理的是碰到来图片文件。这个时候就会找到我们事先写好的file-loader文件。现将这个文件拷贝到输出的目录。然后拷贝的路径当作返回值返回。

webpack URL 加载器 -- url-loader

  • 对一些小图标使用这种url-loader 最终生成base64
{
  test: /.jpeg$/,
  use: [{
    loader: 'url-loader',
    options: {
      limit: 10 * 1024 // 最大10kb进行base64转换。大于10的不进行转换。会进行拷贝类似于file-loader的操作。
    } // 但是还是的安装file-loader. 最终大于10的它会自动调用这个loader.
  }]
}

webpack 加载器分类

  1. 编译转换类。如css-loader
  2. 文件操作类型的加载器。// 最终拷贝到最终输出的文件
  3. 代码质量检查的加载器。 // 如eslint-loader

webpack 处理 es2015

需要安装babel-loader

 {
   test: /.js$/,
   use: {
     loader: 'babel-loader',
     options: {
       presets: ["@babel/preset-env"]
     }
   }
 }

资源加载方法

css-loader可以解决css文件引入的资源文件 html-loader 可以默认解决html文件引入的img-src属性的做处理。

{
  test: /.html$/,
  use: {
    loader: 'html-loader',
    options: {
      attributes: {
        list: [
          {
            tag: 'img',
            attribute: 'src',
            type: 'src',
          },
          {
            tag: 'a',
            attribute: 'href',
            type: 'src',
          }
      ],
      }
    }
  }
}

开发自己的loader

  • 根目录新建markdown-loader.js
  module: {
    rules: [
      {
        test: /.md$/,
        use: [
          'html-loader',
          './markdown-loader' // 使用的loader可以是路径。
        ]
      },
    ]
  }
  • 在markdown-loader.js 使用module.exports 导出一个箭头函数。箭头函数有个参数。则是根据test: /.md$/正则得出来的数据。这个模块返回的时候必须是js字符串。否则会报错。
  • yarn add marked --dev
const marked = require('marked');
module.exports = source => {
  const html = marked(source);
  // return 'console.log(123)'
  // return html
  // return `model.exports = ${JSON.stringify(html)}`
  // return `export default ${JSON.stringify(html)}`
  return html;
}

webpack插件机制 Plugin

  • 清除dist目录
  • 拷贝静态文件到输出目录
  • 压缩输出代码
 // plugin使用: yarn add clean-webpack-plugin --dev
 const CleanWebpackPlugin = require('clean-webpack-plugin')
 plugins: [
  new CleanWebpackPlugin()
]
  • yarn add html-webpack-plugin

开发webpack插件

 class ConsoleLogOnBuildWebpackPlugin {
 apply(compiler) {
   compiler.hooks.emit.tap('ConsoleLogOnBuildWebpackPlugin', compilation => {
     for (const name in compilation.assets) {
       if (name.endsWith('.js')) {
         const content = compilation.assets[name].source();
         const withoutComments = content.replace(/\/\*\*+\*\//g, '');
         compilation.assets[name] = {
           source: () => withoutComments,
           size: () => withoutComments.length
         }
       }
     }
   })
 }
}
plugins: [
 new ConsoleLogOnBuildWebpackPlugin()
]
  • yarn webpack --watch *yarn webpack-dev-server --dev
devServer: {
  contentBase: './public' // 指定额外的资源目录。
},
// http://localhost:8080/index.txt

webpack-dev-server 代理

 devServer: {
   contentBase: './public',
   proxy: {
     // 接口以"/api"为标记。代理到 https://api.github.com
     '/api': {
       target: 'https://api.github.com',
       // 代理完接口:https://api.github.com/api
       // "/api"如果在原接口么有的话可以使用下面这个对象删除它
       pathRewrite: {
         '^/api': ''
       },
       // 原程请求主机名以https://api.github.com为准
       changeOrigin: true 
     }
   }
 },

source Map 介绍

  • 解决代码调试的问题
  • 根据source Map反推得到源代码。方便本地调试。 映射关系:
  • version: “source Map版本”
  • sources: 源代码文件: Array
  • names: 变量名称: Array
  • mapping: base64编码。映射关系
  • 更容易调试
  • 在使用source Map 代码末尾添加一行注释。
  • //# sourceMappingURL=jquer-3.4.1.min.map 有这行注释会自动请求这个文件。显示真正意义上的源代码。

webpack 配置source Map

  • devtool: 'eval | source-map',
    • eval: 构建速度快。只能定位文件不能定位行。
    • source-map: 构建速度慢可以定位到行。
    • webpack.config.js
  devtool: 'eval | source-map'
 // 选择带有module的devtool
 const allModes = [
 'eval',
 'cheap-eval-source-map',
 'cheap-module-eval-source-map', // 推荐
 'eval-source-map',
 'cheap-source-map',
 'cheap-module-source-map',
 'inline-cheap-source-map',
 'inline-cheap-module-source-map',
 'source-map',
 'inline-source-map',
 'hidden-source-map',
 'nosource-source-map'
];

webpack 热替换

  devServer: {
    // hot: true, // 热替换不成功会执行浏览器自动刷新
    hotOnly: true, // 只进行热替换不会自动刷新, 可以显示报错位置。
    contentBase: './public',
    proxy: {
      // 接口以"/api"为标记。代理到 https://api.github.com
      '/api': {
        target: 'https://api.github.com',
        // 代理完接口:https://api.github.com/api
        // "/api"如果在原接口么有的话可以使用下面这个对象删除它
        pathRewrite: {
          '^/api': ''
        },
        // 原程请求主机名以https://api.github.com为准
        changeOrigin: true 
      }
    }
  },

不同环境的webpack 配置。

  1. 配置文件根据环境不同导出不同配置
  2. 一个环境对应一个配置文件

配置文件根据环境不同导出不同配置

一个环境对应一个配置文件

yarn add webpack-merge --deev