webpack 4.x 构建vue项目

此博客使用的版本号 webpack^4.32.2 webpack-cli^3.3.2

vue官方提供了一个基于webpack的集成化的构建工具 vue-cli,可以快速生成一个vue项目模板,不过在你需要根据实际需要做一些配置上的更改时,其操作比较麻烦。所以学习和使用webpack来构建项目是很有必要的,至少要做到看得懂,会改配置。 附上webpack官网

初始化及安装

附上官方初始化指南
初始化npm环境

npm init -y
复制代码

安装webpack

npm install --save-dev webpack webpack-cli
复制代码

在根目录新建webpack.config.js文件

//引入 nodejs 的包
const path = require('path') 
module.exports = {
    //通过选择 development 或 production 之中的一个,来设置 mode 参数,你可以启用相应模式下的 webpack 内置的优化
    mode: 'development',
    // entry 是入口文件
    entry: path.join(__dirname, 'src', 'index.js'),
    // output 是出口文件,filename 是出口文件名字,path 是出口文件的目录地址
    output: {
        filename: 'bundle.js',
        path: path.join(__dirname, 'dist')
    }
}
复制代码

在根目录下新建 index.js, 也就是 webpack.config.js 中的入口文件,输入

console.log('this is webpack')
复制代码

修改 package.json, 往 scripts 里添加 build 命令行

    "build": "webpack --config webpack.config.js"
复制代码

运行 npm run build ,可以看到生成了一个 dist 目录,里面有 bundle.js 文件,切换到 dist 目录下,运行 node bundle.js, 则输出 ‘this is webpack’

到此则表示 webpack 能够正常使用,接下来做进一步的配置

扫描二维码关注公众号,回复: 6594757 查看本文章

dev和build

使用 webpack 时需要将开发和打包分离开,以下是目录结构

webpack.common.js 用来存放生产环境和开发环境的公共代码,webpack.dev.js 用来存放开发环境的配置,webpack.prod.js 用来存放生产环境的配置,所以需要用到 webpack-merge 来融合公共配置和不同环境下的配置 官方文档

npm i webpack-merge --save-dev
复制代码

对其做进一步优化,在根目录下新建 src 文件夹,将 index.js 移入

// webpack.common.js 公共配置
const path = require('path')
const srcPath = path.join(__dirname, '..', 'src')
module.exports = {
  entry: path.join(srcPath,'index.js')
}
复制代码

production

// 生产环境 webpack.prod.js
const path = require('path')
const webpackCommonConf = require('./webpack.common.js')
const { smart } = require('webpack-merge')
const distPath = path.join(__dirname, '..','dist') 
module.exports = smart(webpackCommonConf,{
  mode: 'production',
  output: {
    filename: 'bundle.[contentHash:8].js', // 打包时加上8位 hash 戳
    path: distPath
  }
})
复制代码

接下来 package.json 的 scripts 也要修改

"scripts": {
    "build": "webpack --config build/webpack.prod.js"
  },
复制代码

运行 npm run build ,可以看到 dist 目录下生成了 js 文件

不过我们发现,dist 目录下有两个js文件,这是由于刚开始测试打包时我们没有用到hash来为文件命名,后来又用到了,这就导致两个文件的文件名不一样,所以会生成两个文件,导致我们的 /dist 文件夹相当杂乱。webpack 会生成文件,然后将这些文件放置在 /dist 文件夹中,但是 webpack 无法追踪到哪些文件是实际在项目中用到的。 通常,在每次构建前清理 /dist 文件夹,是比较推荐的做法,因此只会生成用到的文件。让我们完成这个需求。 官方文档 安装

npm install clean-webpack-plugin --save-dev
复制代码

修改 webpack.prod.js

// 生产环境 webpack.prod.js
const path = require('path')
const webpackCommonConf = require('./webpack.common.js')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const { smart } = require('webpack-merge')
const distPath = path.join(__dirname, '..', 'dist')
module.exports = smart(webpackCommonConf, {
  mode: 'production',
  output: {
    filename: 'bundle.[contentHash:8].js', // 打包时加上8位 hash 戳
    path: distPath
  },
  plugins: [
    new CleanWebpackPlugin()
  ]
})

复制代码

再次打包时 dist 里的js文件就只有一个了

development

首先在 src 目录下新建一个 index.html 作为本地服务启动的载体,并初始化 安装插件

npm install --save-dev html-webpack-plugin
复制代码

在webpack.common.js里配置

// webpack.common.js 公共配置
const path = require('path')
const srcPath = path.join(__dirname, '..', 'src')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: path.join(srcPath, 'index.js'),
  plugins: [
    new HtmlWebpackPlugin({
      template: path.join(srcPath, 'index.html'),
      filename: 'index.html'
    })
  ]
}
复制代码

此时打包就会在dist目录下生成一个index.html 文件 安装 webpack-dev-server 官方文档

npm install --save-dev webpack-dev-server
复制代码

使用

// webpack.dev.js
const { smart } = require('webpack-merge')
const path = require('path')
const webpackCommonConf = require('./webpack.common.js')
const distPath = path.join(__dirname, '..','dist')
module.exports = smart(webpackCommonConf, {
  mode: 'development',
  devServer: {
    port: 3000,
    progress: true, // 显示打包的进度条
    contentBase: distPath, // 目录
    open: true, // 自动打开浏览器
    compress: true, // 启动 gzip 压缩
    hot: true // 启动热模块替换
  }
})
复制代码

修改package.json

"dev": "webpack-dev-server --config build/webpack.dev.js"
复制代码

运行npm run dev 即可

ES6

浏览器无法解析es6语法,所以要通过babel将es6转换为es5,babel官网

安装 babel系列

npm install --save-dev babel-loader @babel/core @babel/preset-env
复制代码

es6的转换在开发和生产都要使用,所以修改 webpack.common.js 配置,添加

module: {
    rules:[
      {test: /\.js$/, exclude: /node_modules$/, loader: 'babel-loader'}
    ]
  }
复制代码

在根目录下新建 .babelrc 文件,其内容为

{
  "presets": ["@babel/preset-env"]
}
复制代码

接下来做一下测试,将src下index.js里用上es6 的语法,看看能不能正常运行

const fn = ()=>{
  alert('babel test')
}
fn()
复制代码

运行npm run dev,

表示babel正常运行

source map

source map用来定位打包时遇到的错误,打包编译时通常是将多个文件打包为一个文件,如果没有source map,错误只会定位到你打包之后的那个单文件 官方文档 在webpack.prod.js里加上

devtool: 'source-map'
复制代码

运行npm run build可以看到,dist下生成了.map文件

使用css和stylus

webpack把文件都模块化,所以css文件需要loader处理,安装

npm install --save-dev css-loader style-loader
复制代码

配置,loader的执行顺序是从后往前的

{
        test: /\.css$/,
        exclude: /node_modules$/,
        loader: ['style-loader','css-loader']
      }
复制代码

新建一个css文件,在js中引入,运行npm run dev就可以看到效果 安装sass

npm install sass-loader node-sass webpack --save-dev
复制代码

使用

{
        test: /\.scss$/,
        exclude: /node_modules$/,
        use: ['style-loader', 'css-loader', 'sass-loader']
      }
复制代码

抽离css

npm install --save-dev mini-css-extract-plugin
复制代码

在webpack.prod.js中使用

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
-------------------------------------------------------------------
plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].css',
      chunkFilename: '[id].css',
    })
  ],
module:{
    rules:[
      {
        test: /\.scss$/,
        exclude: /node_modules$/,
        use: [{
          loader: MiniCssExtractPlugin.loader,
          options: {
            publicPath: '../',
            hmr: process.env.NODE_ENV === 'development',
          },
        }, 'css-loader', 'sass-loader']
      }
    ]
  },
复制代码

设置别名和文件扩展名

官方文档 在webpack.common.js中

resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      '@': path.join(__dirname, '..', 'src')
    }
  },
复制代码

加载图片字体

官方文档

Vue

安装loader

npm install -D vue-loader vue-template-compiler
复制代码

官方文档

.eslintrc

module.exports = {
    root: true,
    env: {
      node: true
    },
    'extends': [
      'plugin:vue/essential',
      '@vue/standard'
    ],
    rules: {
      'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
      'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
    },
    parserOptions: {
      parser: 'babel-eslint'
    }
  }
  
复制代码

报错提示什么安装什么

转载于:https://juejin.im/post/5d0789a55188252b8d1d41e2

猜你喜欢

转载自blog.csdn.net/weixin_34123613/article/details/93179248