vue-cli的webpack模板项目配置文件分析

yizhihongxing

下面是“vue-cli的webpack模板项目配置文件分析”的完整攻略:

一、什么是vue-cli的webpack模板项目配置文件?

vue-cli是官方提供的Vue.js项目脚手架,通过vue-cli可以快速创建一个基于Vue.js的项目脚手架,而webpack是一种模块化管理工具,可以将多个JavaScript文件打包到一个文件,以便于浏览器加载和解析。vue-cli的webpack模板项目配置文件则是将Vue.js和webpack相结合的配置文件,它可以对项目进行打包、优化等操作。

在vue-cli的webpack模板项目中,配置文件通常分为两种:webpack.base.conf.jswebpack.prod.conf.jswebpack.base.conf.js是webpack的基础配置文件,包含了公共的配置选项,如入口文件、输出路径、模块解析规则等。而webpack.prod.conf.js是webpack的生产环境配置文件,主要包含了针对生产环境的打包、优化等配置。

二、分析vue-cli的webpack模板项目配置文件

1. webpack.base.conf.js

以下是webpack.base.conf.js的代码示例:

const path = require('path')
const webpack = require('webpack')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')

module.exports = {
  entry: {
    app: './src/main.js'
  },
  output: {
    path: path.resolve(__dirname, '../dist'),
    filename: '[name].js',
    publicPath: '/'
  },
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
      'assets': resolve('src/assets'),
      'components': resolve('src/components')
    }
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        use: [{
          loader: 'vue-loader',
          options: {
            loaders: {
              sass: ExtractTextPlugin.extract({
                use: ['css-loader', 'sass-loader'],
                fallback: 'vue-style-loader'
              })
            }
          }
        },
        {
          test: /\.js$/,
          use: 'babel-loader',
          include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
        },
        {
          test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
          use: [
            {
              loader: 'url-loader',
              options: {
                limit: 10000,
                name: 'img/[name].[hash:7].[ext]'
              }
            },
            {
              loader: 'image-webpack-loader',
              options: {
                bypassOnDebug: true
              }
            }
          ]
        },
        {
          test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
          use: [
            {
              loader: 'url-loader',
              options: {
                limit: 10000,
                name: 'media/[name].[hash:7].[ext]'
              }
            }
          ]
        },
        {
          test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
          use: [
            {
              loader: 'url-loader',
              options: {
                limit: 10000,
                name: 'fonts/[name].[hash:7].[ext]'
              }
            }
          ]
        }
      ]
    }
  },
  plugins: [
    new webpack.optimize.CommonsChunkPlugin({
      name: 'vendor',
      minChunks: function (module) {
        return (
          module.resource &&
          /\.js$/.test(module.resource) &&
          module.resource.indexOf(
            path.join(__dirname, '../node_modules')
          ) === 0
        )
      }
    }),
    new webpack.optimize.CommonsChunkPlugin({
      name: 'manifest',
      chunks: ['vendor']
    }),
    new ExtractTextPlugin({
      filename: 'css/[name].[contenthash].css'
    }),
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: 'index.html',
      inject: true
    }),
    new CopyWebpackPlugin([
      {
        from: path.resolve(__dirname, '../static'),
        to: 'static',
        ignore: ['.*']
      }
    ])
  ]
}
  • entry

entry指定了打包入口文件,这里指定的入口文件为./src/main.js

  • output

output指定了打包后文件的输出路径和文件名,这里采用了path.resove方法获得当前目录的上一级目录,然后将输出路径设为../dist,将输出文件名设为[name].js,其中[name]会被替换为entry中的键名。publicPath指定了构建好的静态文件在浏览器中访问时的路径前缀,这里设为根路径/

  • resolve

resolve配置了模块解析的规则和别名。extensions指定了在引用模块时可以省略的后缀名,这里可以省略.js.vue.json后缀。alias则是自定义的模块别名,方便在应用内部引用模块。这里将vue指定为vue/dist/vue.esm.js@指定为src目录,assets指定为src/assets目录,components指定为src/components目录。

  • module

module配置了如何处理模块。rules是一个数组,每一项都是一个规则对象。这里定义了对于打包的处理规则。其中,test指定了哪些文件会被打包,这里分为.vue.js、图片、媒体、字体文件等不同的类型。use是从右到左执行的加载器,vue-loader.vue文件进行处理,babel-loader.js文件进行处理,使其兼容大部分浏览器。url-loader对图片、音视频都进行处理,其中对图片进行了base64编码处理。image-webpack-loader对图片进行压缩和优化。

  • plugins

plugins是插件数组,通过插件可以扩展webpack的功能。这里定义了多个插件,包括提取公共代码、生成html、复制静态资源等。其中,CommonsChunkPlugin插件用于提取公共代码,将第三方库通过CDN的方式引入,以减少打包后的文件大小,加快应用的首屏加载速度。HtmlWebpackPlugin用于生成HTML文件,并将打包后的JavaScript和CSS文件插入到HTML中。CopyWebpackPlugin则用于复制静态资源,如favicon等。

2. webpack.prod.conf.js

以下是webpack.prod.conf.js的代码示例:

const path = require('path')
const webpack = require('webpack')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')

const webpackConfig = merge(baseWebpackConfig, {
  devtool: '#cheap-module-eval-source-map',
  module: {
    rules: ExtractTextPlugin.extract({
      use: [{
        loader: 'css-loader',
        options: {
          minimize: true
        }
      }, 'postcss-loader', 'sass-loader'],
      fallback: 'vue-style-loader'
    })
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
     new UglifyJsPlugin({
       uglifyOptions: {
         compress: {
           warnings: false
         }
       },
       sourceMap: false,
       parallel: true
     }),
     new ExtractTextPlugin({
       filename: 'css/[name].[contenthash].css'
     }),
     new OptimizeCSSPlugin({
       cssProcessorOptions: {
         safe: true
       }
     })
  ]
})

module.exports = webpackConfig
  • devtool

devtool用于指定开发模式下使用的sourcemap类型,这里指定为#cheap-module-eval-source-map

  • module

module同样用于定义模块解析的规则,这里的处理规则与webpack.base.conf.js略有不同,通过ExtractTextPlugin提取CSS文件。

  • plugins

plugins中定义了多个插件,包括定义环境变量、压缩JavaScript代码和CSS样式、提取CSS等。其中,DefinePlugin插件用于定义环境变量,这里定义了NODE_ENVproductionUglifyJsPlugin用于压缩JavaScript代码,这里配置了压缩选项compresswarnings设为falseExtractTextPlugin插件用于将CSS样式文件抽取成单独的文件,这里文件名中包含了哈希值,防止浏览器缓存。OptimizeCSSPlugin插件用于压缩CSS样式文件。

三、示例说明

1. 如何修改默认入口文件

在开发过程中,可能需要使用多个入口文件。此时只需要在entry中添加需要的入口文件即可:

module.exports = {
  entry: {
    'app': './src/app.js',
    'home': './src/home.js'
  }
  // ...
}

以上代码将会生成两个JavaScript文件:app.jshome.js

2. 如何自定义Webpack的loader

module中,可以自定义Webpack的loader。例如,我们想要使用stylus语言编写CSS样式文件。首先,我们需要安装stylus-loader

npm i -D stylus-loader

然后,我们可以在webpack.base.conf.jsmodule中添加以下规则定义:

// ...

const stylusRule = {
  test: /\.styl$/,
  use: ['vue-style-loader', 'css-loader', 'postcss-loader', 'stylus-loader']
}

module.exports = {
  entry: {
    app: './src/main.js'
  },

  // ...

  module: {
    rules: [
      {
        test: /\.vue$/,
        // ...
      },
      {
        test: /\.js$/,
        // ...
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        // ...
      },
      {
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        // ...
      },
      stylusRule
    ]
  },

  // ...
}

以上代码中,我们将定义了一个名为stylusRule的规则对象,包含了.styl文件的匹配规则和使用的loader列表。在module中添加该规则即可。

四、总结

以上就是vue-cliwebpack模板项目配置文件的分析和示例说明,通过对模板文件的分析,我们可以了解到如何修改默认的入口文件,如何添加自定义loader等。同时,我们也可以深入了解Webpack的各种配置项和插件,以便更好地配置和优化Vue.js项目。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue-cli的webpack模板项目配置文件分析 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue interceptor 使用教程实例详解

    介绍 vue-interceptor 是 Vue.js 的 HTTP 拦截器插件,它可以在请求发送和响应返回时自定义拦截处理,从而允许我们进行统一的请求前、后处理。本文将详细讲解并演示 Vue interceptor 的使用教程。 安装 我们可以通过 NPM 或 Yarn 来下载安装 Vue interceptor: npm install vue-inte…

    Vue 2023年5月28日
    00
  • vue初尝试–项目结构(推荐)

    下面是针对“Vue初尝试–项目结构(推荐)”的完整攻略: 1. 什么是Vue Vue是一套用于构建用户界面的渐进式框架。与其他大型框架不同的是,Vue被设计为可以逐层应用。Vue的核心库只关注视图层,非常容易学习和集成,同时也可以通过插件或结合其他库来构建完整的单页应用。 2. Vue项目结构推荐 下面,我们来看一下Vue项目的结构推荐: ├── buil…

    Vue 2023年5月29日
    00
  • vue3的hooks用法总结

    当谈到Vue 3中新的功能时,不得不提的是它的Hooks。Hooks是一种新的组件API,它可以让我们在函数组件中使用状态和其他React类组件中使用的功能。它在处理组件逻辑时很实用,特别是在实现可重用性和分离关注点方面。 在Vue 3中,我们可以使用若干个Hooks,包括setup、ref、reactive、watch、computed、provide、i…

    Vue 2023年5月28日
    00
  • Vue路由跳转方式区别汇总(push,replace,go)

    Vue路由跳转方式区别汇总(push,replace,go) Vue路由提供了多种方式实现页面间的跳转,其中包括路由的跳转、前进、后退等。在进行路由跳转时,我们通常会使用3种方式,包括push、replace和go。 push push是将目标路由地址添加到路由历史记录中,此时可以通过浏览器的后退按钮回退到上一个页面。同时使用push方式跳转,可以利用par…

    Vue 2023年5月27日
    00
  • 在vue中使用eslint,配合vscode的操作

    确保已安装Vue CLI和VS Code,并在Vue项目中启用ESLint扩展。 步骤一:安装ESLint 在终端中运行以下命令安装ESLint: npm install eslint -D 步骤二:安装Vue ESLint插件 运行以下命令安装Vue ESLint插件: npm install eslint-plugin-vue -D 步骤三:初始化一个E…

    Vue 2023年5月28日
    00
  • 简述vue状态管理模式之vuex

    下面是详细讲解“简述Vue状态管理模式之Vuex”的攻略。 规划状态 在使用Vuex之前,我们需要先规划出需要管理的状态。这些状态可能是组件之间需要共享的数据,例如用户登录状态、购物车商品列表、主题等。 Vuex状态应该以应用程序的核心管理问题为基础,需要考虑的因素如下: 所有组件都需要此状态吗? 这种状态是可变的,还是不变的? 这种状态是从哪里来的? 安装…

    Vue 2023年5月27日
    00
  • vue2从数据变化到视图变化之nextTick使用详解

    Vue2从数据变化到视图变化之nextTick使用详解 在Vue中,当我们修改数据时,Vue会帮我们自动更新视图,这是因为Vue使用了一种叫做“响应式原理”的技术,当数据发生变化时,会自动触发视图的更新。但是,有些情况下我们希望在DOM更新后再执行某些操作,这时就需要使用Vue提供的nextTick方法。本文将详细讲解nextTick的用法和原理。 next…

    Vue 2023年5月29日
    00
  • Vue3 composition API实现逻辑复用的方法

    当我们使用Vue3进行开发时,使用Vue Composition API可以极大地提升我们的开发效率。这里详细介绍了如何使用Vue3 Composition API实现逻辑复用的方法。 什么是Vue3 Composition API Vue3 Composition API是一种新的、基于函数的API,它可以让我们更灵活地组织我们的逻辑代码,提高代码的可读性…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部