欢迎访问宙启技术站
智能推送

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

发布时间:2023-05-15 13:33:07

Vue.js是一款非常优秀的JavaScript前端框架,它特别适合大型单页应用的构建。而vue-cli则是Vue.js的一个脚手架工具,它能够快速生成Vue.js项目的基础架构,让开发者可以更快的开始编写代码。其中,webpack模板是vue-cli提供的其中一种模板,它使用了Webpack作为打包工具。在webpack模板项目的根目录下,有多个重要的配置文件,本文将根据vue-cli 2.x版本的项目文档,对这些配置文件的示例进行详细介绍。

1. package.json

package.json是在npm初始化项目时创建的,它提供了对项目以及依赖项的描述信息。在webpack模板中,package.json中主要有以下几个配置项:

{
  "name": "vue-webpack-template",
  "version": "2.0.0",
  "description": "A full-featured Webpack setup for Vue.js 2.0",
  "author": "Evan You",
  "private": true,
  "scripts": {
    "dev": "node build/dev-server.js",
    "build": "node build/build.js",
    "unit": "jest --config test/unit/jest.conf.js --coverage",
    "e2e": "node test/e2e/runner.js",
    "test": "npm run unit && npm run e2e",
    "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
    "deploy": "node deploy/deploy.js"
  },
  "dependencies": {
    // 依赖项
  },
  "devDependencies": {
    // 开发依赖项
  },
  "engines": {
    "node": ">= 4.0.0",
    "npm": ">= 3.0.0"
  }
}

scripts中定义了多个npm脚本命令,可以通过npm run [command] 的方式执行。dev、build、unit、e2e分别对应开发模式、生产模式、单元测试、e2e测试的启动命令;test则是代码测试的启动命令;lint用于代码风格检查;deploy用于部署。dependencies表示项目的生产依赖,而devDependencies则是开发依赖。engines是指定项目所必须的Node.js和npm版本。

2. .babelrc

.babelrc文件是babel配置文件,用于指定babel转换的规则和插件。在webpack模板中,.babelrc内容如下:

{
  "presets": [
    ["es2015", { "modules": false }],
    "stage-2"
  ],
  "plugins": ["transform-runtime"],
  "env": {
    "test": {
      "presets": ["env", "stage-2"],
      "plugins": ["istanbul", "transform-runtime"]
    }
  }
}

presets指定了babel预设,es2015和stage-2是babel自带的预设,其中es2015用于将ES6/ES2015的代码转为ES5的代码,而stage-2用于转换最新的ES6/ES2015特性。plugins指定了babel插件,这里使用了transform-runtime插件,该插件可以减少代码体积,避免重复使用一些辅助方法。env属性是指定不同环境下的babel转换规则,这里指定了test环境下babel转换的规则和插件。

3. postcss.config.js

postcss.config.js文件是postcss的配置文件,用于指定PostCSS插件和其它配置信息。在webpack模板中,postcss.config.js内容如下:

module.exports = {
  plugins: [
    require('postcss-import')(),
    require('postcss-url')(),
    require('postcss-cssnext')(),
    require('postcss-pxtorem')({
      rootValue: 75,
      propList: ['*']
    })
  ]
}

plugins指定了要使用的PostCSS插件,这里使用了postcss-import、postcss-url、postcss-cssnext和postcss-pxtorem插件。其中,postcss-pxtorem该插件可以将像素单位转换为rem单位,以便适配不同的屏幕分辨率。rootValue属性指定了1rem对应的像素值,这里是75px,propList属性指定要转换的CSS样式属性。

4. webpack.base.conf.js

webpack.base.conf.js是webpack的基础配置文件,主要用于应用于生产和开发环境的公共配置。在webpack模板中,webpack.base.conf.js内容如下:

const path = require('path')
const vueLoaderConfig = require('./vue-loader.conf')

function resolve (dir) {
  return path.join(__dirname, '..', dir)
}

module.exports = {
  entry: {
    app: './src/main.js'
  },
  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src')
    }
  },
  module: {
    rules: [
      {
        test: /\.(js|vue)$/,
        loader: 'eslint-loader',
        enforce: 'pre',
        include: [resolve('src'), resolve('test')],
        options: {
          formatter: require('eslint-friendly-formatter')
        }
      },
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: vueLoaderConfig
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        include: [resolve('src'), resolve('test')]
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('media/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
        }
      }
    ]
  },
  node: {
    // 防止 webpack 注入无用 setImmediate polyfill,因为只在浏览器中使用
    setImmediate: false,
    // 防止 webpack 用法的入口点(例如:style-loader/lib/addStyles.js)产生大量警告
    dgram: 'empty',
    fs: 'empty',
    net: 'empty',
    tls: 'empty',
    child_process: 'empty'
  }
}

其中,entry属性指定了入口文件,这里是src/main.js;output属性指定了打包文件输出路径和名称;resolve属性用于指定模块如何被解析;alias属性用于设置模块别名;module属性用于定义各种loader规则,这里定义了用于处理js和vue文件的loader规则和用于处理图片、音频、字体等资源文件的loader规则;node属性用于定义哪些Node.js全局变量存在。

5. webpack.dev.conf.js

webpack.dev.conf.js文件是webpack的开发环境配置文件,主要用于配置开发模式下的webpack打包方式。在webpack模板中,webpack.dev.conf.js内容如下:

`js

const webpack = require('webpack')

const merge = require('webpack-merge')

const HtmlWebpackPlugin = require('html-webpack-plugin')

const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')

const portfinder = require('portfinder')

const baseWebpackConfig = require('./webpack.base.conf')

const utils = require('./utils')

const config = require('../config')

const HOST = process.env.HOST

const PORT = process.env.PORT && Number(process.env.PORT)

const devWebpack