webpack

348 阅读3分钟

什么是webpack

webpack 是一个现代 JavaScript 应用程序的模块打包器(module bundler),分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Sass,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。

webpack安装

注意:请先安装node环境

建议大家这样操作(随时切换镜像源):

  1. npm install nrm -g // 安装nrm

  2. nrm ls // 查看镜像源

  3. nrm use taobao // 选择淘宝镜像,也可以选择cnpm

  4. npm install webpack webpack-cli -g

使用webpack

01-webpack:

使用命令:webpack 输入文件路径 将一个文件打包成另外一个文件 默认情况下会在当前目录下创建dist文件夹并将指定的源文件打包转换为main.js文件

02-webpack-config:

配置webpack.config.js:文件不要随意 运行webpack

var path = require('path')
module.exports = {
  // 入口文件配置
  entry: "./src/app.js",
  
  // 出口文件配置项
  output: {
    // 输出的路径,webpack2起就规定必须是绝对路径
    path: path.join(__dirname, 'dist'),
    // 输出文件名字
    filename: "bundle.js"
  }
}

03-webpack-dev-server:能够自动打开浏览器,对于代码的修改能够自动刷新

  1. 运行:npm init -y
  2. 运行:npm i webpack-dev-server -g
var path = require('path')

module.exports = {
    // 设置文件的入口:一开始就解析这个文件
    entry:'./src/app.js',
    // 将入口文件解析为目标文件的配置
    output:{
        // 目标文件的输出路径文件夹名称
        path:path.join(__dirname,"dist"),
		//老版本会使用publicPath来实现添加公共路径的配置
        // publicPath: '/dist',
        // 目标文件的文件名称
        filename:'main.js'
    },
    // 建议使用这个配置,新版本建议这样配置,默认会生成main.js
    devServer:{
        publicPath: '/dist'
    }
}
  1. 运行 webpack-dev-server --open.--open可以自动的打开浏览器

04-webpack-css:

  • 下载:npm install css-loader style-loader --save-dev
    • css-loader:css解析器,将css解析为浏览器可以识别的类型
    • style-loader:自动的在指定文件中添加style标签,同时添加指定的样式代码
  • 在webpack.config.js文件中添加配置
// 下面这个成员就是不同类型的文件的解析加载规则
module: {
    rules: [
        // 配置的是用来解析.css文件的loader(style-loader和css-loader)
        {
            // 1.0 用正则匹配当前访问的文件的后缀名是  .css
            test: /\.css$/,
            use: ['style-loader', 'css-loader'] //webpack底层调用这些包的顺序是从右到左
        }
    ]
}

05-webpack-less&webpack-sass:

npm install less less-loader sass-loader node-sass --save-dev

  • less less-loader:添加对less的处理支持
  • sass-loader node-sass:添加对scss的处理支持
{
    test: /\.less$/,
    use: [{
        loader: 'style-loader'
    }, {
        loader: 'css-loader'
    }, {
        loader: 'less-loader'
    }]
},
{
    test: /\.scss$/,
    use: [{
        loader: 'style-loader'
    }, {
        loader: 'css-loader'
    }, {
        loader: 'sass-loader'
    }]
}

06-webpack-图片&字体:

npm install file-loader url-loader --save-dev

url-loader封装了file-loader

可以添加对图片资源或者图标资源的支持

07-webpack-babel

一些老版的浏览器可能不支持ES6,这个babel的作用就是能够将ES6转换ES5,达到兼容的目的

npm install babel-loader @babel/core @babel/preset-env --save-dev

注意:

webpack 1.x | babel-loader <= 6.x

webpack 2.x | babel-loader >= 7.x (推荐) (^6.2.10 也能用, 但是会出现不推荐使用的警告)

webpack 3.x | babel-loader >= 7.1

 {
      test: /\.js$/,
      // Webpack2建议尽量避免exclude,更倾向于使用include
      // exclude: /(node_modules)/, // node_modules下面的.js文件会被排除
      include: [path.resolve(__dirname, 'src')],
      use: {
        loader: 'babel-loader',
        // options里面的东西可以放到.babelrc文件中去
        options: {
            presets: ['@babel/preset-env']
          }
      }
    }

// .babelrc文件内的配置
{
  "presets":['@babel/preset-env']
}

08-html-webpack-plugin

主要作用:

  • 为html文件中引入的外部资源如script、link动态添加每次compile后的hash,防止引用缓存的外部文件问题
  • 可以生成创建html入口文件,比如单页面可以生成一个html文件入口,配置N个html-webpack-plugin可以生成N个页面入口

使用过程:

  • 下载:npm i webpack webpack-cli -S:它要求使用非全局的webpack
  • 下载:npm install --save-dev html-webpack-plugin
  • 在webpack.config.js文件中添加配置
const htmlWebpackPlugin = require('html-webpack-plugin');
----------------------------------------------------------
plugins: [
    new htmlWebpackPlugin({
        // template:'index.html',
        filenmae: 'index.html'
    })
]

注释掉devServer的配置,不然会冲突

  • 补充说明:常见配置
    • title:生成的html文档的标题。配置该项,它并不会替换指定模板文件中的title元素的内容,除非html模板文件中使用了模板引擎语法来获取该配置项值,可以在html页面中的title位置添加如下替换:<%= htmlWebpackPlugin.options.title %>
    • filename:输出文件的文件名称,默认为index.html,不配置就是该文件名
    • template:本地模板文件的位置,支持加载器(如handlebars、ejs、undersore、html等),如果没有指定,那么就会自动的创建
    • inject:向template或者templateContent中注入所有静态资源,不同的配置值注入的位置不经相同
      • true或者body:所有JavaScript资源插入到body元素的底部
      • head: 所有JavaScript资源插入到head元素中
      • false: 所有静态资源css和JavaScript都不会注入到模板文件中
    • favicon: 添加特定favicon路径到输出的html文档中