webpack入门

webpack入门

初始化项目

初始化npm

npm init

webpack在node环境下运行,需要下载webpack和webpack-cli

npm i -D webpack webpack-cli

-D: --save-dev
-S: --save

新建文件夹src,在该目录下生成main.js文件,可以写些测试代码

console.log('hello world')

配置package.json

"scripts": {
  "build": "webpack src/main.js"
},

执行

npm run build

生成dist文件夹,里面含有main.js文件就表明打包成功了。以上,都是webpack的默认配置,现在来看自定义配置

自定义配置

新建build文件夹,在该文件夹中生成文件名为webpack.config.js的文件

const path = require('path')
module.exports = {
  mode: "development", // 打包模式
  entry: path.resolve(__dirname, '../src/main.js'),
  output: {
    filename: 'output.js', // 打包后输出的文件名
    path: path.resolve(__dirname, '../dist') // 打包后的输出目录
  }
}

上面输出的文件名都是output.js,要对其进行更改

const path = require('path')
module.exports = {
  mode: "development", // 打包模式
  entry: path.resolve(__dirname, '../src/main.js'),
  output: {
    filename: '[name].[hash:8].js', // 打包后输出的文件名
    path: path.resolve(__dirname, '../dist') // 打包后输出的文件目录
  }
}

配置html模板

webpack打包完成后,需要每次去html文件那手动去更改js文件名显得很麻烦,这边使用插件来帮我们完成这件事

  npm i -D html-webpack-plugin

在根目录下面新建一个public文件夹,在该文件夹中生成index.html文件

webpack.config.js具体配置如下:

  const path = require('path')
  const HtmlWebpackPlugin = require('html-webpack-plugin')
  module.exports = {
    mode: "development", // 打包模式
    entry: path.resolve(__dirname, '../src/main.js'),
    output: {
      filename: '[name].[hash:8].js', // 打包后输出的文件名
      path: path.resolve(__dirname, '../dist') // 打包后输出的文件目录
    },
    plugins: [
      new HtmlWebpackPlugin({
        template: path.resolve(__dirname, '../public/index.html')
      })
    ]
  }

运行代码,可以发现js已自动注入到html文件中,如图所示:
js注入html页面

  • 多入口文件开发

    使用多个html-webpack-plugin实例来解决这个问题

  const path = require('path')
  const HtmlWebpackPlugin = require('html-webpack-plugin')
  module.exports = {
    mode: "development", // 打包模式
    entry: {
      main: path.resolve(__dirname, '../src/main.js'),
      test: path.resolve(__dirname, '../src/test.js')
    },
    output: {
      filename: '[name].[hash:8].js', // 打包后输出的文件名
      path: path.resolve(__dirname, '../dist') // 打包后输出的文件目录
    },
    plugins: [
      new HtmlWebpackPlugin({
        template: path.resolve(__dirname, '../public/index.html'),
        filename: 'index.html',
        chunks: ['main'] // 与入口文件对应的模块名
      }),
      new HtmlWebpackPlugin({
        template: path.resolve(__dirname, '../public/test.html'),
        filename: 'test.html',
        chunks: ['test'] // 与入口文件对应的模块名
      })
    ]
  }

运行代码,此时生成的dist目录是这样的,如下图所示:
多入口文件开发

在打包前,清空dist文件夹

每次执行完代码,发现都会残留上一次生成的文件,可以通过clean-webpack-plugin清空文件

  const { CleanWebpackPlugin } = require('clean-webpack-plugin')
  module.exports = {
    // ...省略其它配置
    plugins: [
      new CleanWebpackPlugin()
    ]
  }

注: clean-webpack-plugin是通过解构进行引用的,一不小心就会报下面这个错误,如图所示:
clean-webpack-plugin报错

引入css文件

入口文件为js,因此在入口文件引入css文件,如下图所示:
引入css文件

同时,需要一些loader来解析css文件

  npm i -D style-loader css-loader

如若还有less等来构建样式,还需多下载两个loader

  npm i -D less less-loader

在index.css写的样式为:

  div {
    color: red;
  }

在test.less写的样式为:

  div {
    font-size: 50px;
  }

webpack.config.js的配置如下

module.exports = {
  // ...省略其它配置
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader'] // 从右向左解析
      },
      {
        test: /\.less$/,
        use: ['style-loader', 'css-loader', 'less-loader'] // 从右向左解析
      }
    ]
  }
}

给css样式加入前缀

  npm i -D postcss-loader autoprefixer
  • 方式一
    在项目根目录创建postcss.config.js文件,配置如下:
  module.exports = {
    plugins: [
      require('autoprefixer')
    ]
  }
  • 方式二
    直接在webpack.config.js里进行配置
module.exports = {
  // ...省略其它配置
  module: {
    rules: [
      {
        test: /\.less$/,
        use: ['style-loader', 'css-loader', {
          loader: 'postcss-loader',
          options: {
            plugins: [require('autoprefixer')]
          }
        }, 'less-loader'] // 从右向左解析
      }
    ]
  }
}

拆分css

(1) mini-css-extract-plugin
把css样式从js文件中提取出来,webpack4.0以前,使用extract-text-webpack-plugin,4.0以后推荐使用mini-css-extract-plugin

配置如下:

const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
  // ...省略其它配置
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader'] // 从右向左解析
      },
      {
        test: /\.less$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader', 
          {
            loader: 'postcss-loader',
            options: {
              plugins: [require('autoprefixer')]
            }
          }, 
          'less-loader'
        ] // 从右向左解析
      }
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].[hash:8].css",
      chunkFilename: "[id].css"
    })
  ]
}

css样式合并为一个,如图所示:
在这里插入图片描述
css解析

(2)extract-text-webpack-plugin@next
mini-css-extract-plugin是将所有的css文件合并到一个css文件当中,目前该插件还不支持一一对应的多个css文件,因此需要安装extract-text-webpack-plugin@next

  npm i -D extract-text-webpack-plugin@next

配置如下:

const ExtractTextWebpackPlugin = require('extract-text-webpack-plugin')
const indexCss = new ExtractTextWebpackPlugin('index.css')
const testLess = new ExtractTextWebpackPlugin('test.less')
module.exports = {
  // ...省略其它配置
  module: {
    rules: [
      {
        test: /\.css$/,
        use: indexCss.extract({
          use: ['css-loader']
        }) // 从右向左解析
      },
      {
        test: /\.less$/,
        use: testLess.extract({
          use: [
            'css-loader',
            {
              loader: 'postcss-loader',
              options: {
                plugins: [require('autoprefixer')]
              }
            }, 
            'less-loader'
          ]
        })// 从右向左解析
      }
    ]
  },
  plugins: [
    indexCss,
    testLess
  ]
}

使用babel转义js文件

  npm i -D babel-loader @babel/preset-env @babel/core

配置如下:

module.exports = {
  // ...省略其它配置
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        },
        exclude: /node_modules/
      }
    ]
  }
}

babel-loader只能将es6、es7、es8的语法转成es5,但是对于新的api并没有转化功能,因为要引入该插件

  npm i @babel/polyfill

配置如下:

module.exports = {
  // ...省略其它配置
  entry: {
    main: ['@babel/polyfill',path.resolve(__dirname, '../src/main.js')],
    test: ['@babel/polyfill', path.resolve(__dirname, '../src/test.js')]
  }
}

Everyday is a clean slate!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值