• vue-cli的webpack模版项目配置解析


    上一篇文章已经分析了build/dev-server.js,里面使用到了其他config文件。
    那么我们这篇文章,按着dev-server.js的使用顺序,来分析下其他文件。
    首选,调用check-versions.js 模块,检查nodenpm的版本,是否符合最低要求。这里,单独分出来了一个文件check-versions.js
    check-versions.js

    var chalk = require('chalk') //定制终端字符串的颜色输出样式
    var semver = require('semver')  // 语义化版本控制规范
    var packageConfig = require('../package.json') 
    var shell = require('shelljs') // 调用系统命令
    
    // 调用子线程同步执行 cmd终端命令
    function exec (cmd) {
      return require('child_process').execSync(cmd).toString().trim()
    }
    
    var versionRequirements = [
      {
        name: 'node',
        currentVersion: semver.clean(process.version),
        versionRequirement: packageConfig.engines.node
      },
    ]
    
    if (shell.which('npm')) {
      versionRequirements.push({
        name: 'npm',
        currentVersion: exec('npm --version'),
        versionRequirement: packageConfig.engines.npm
      })
    }
    
    module.exports = function () {
      var warnings = []
      for (var i = 0; i < versionRequirements.length; i++) {
        var mod = versionRequirements[i]
        // semver.satisfies如果版本满足要求,返回true
        // 这里取反,不满足则将 警告存入warnings数组,供后面使用
        // 警告的内容是: 系统当前版本(红色字体) should be 应用程序要求的版本(绿色字体)
        if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
          warnings.push(mod.name + ': ' +
            chalk.red(mod.currentVersion) + ' should be ' +
            chalk.green(mod.versionRequirement)
          )
        }
      }
    
    // 如果有警告,则用黄色字体将警告输出到终端,并终止当前进程
      if (warnings.length) {
        console.log('')
        console.log(chalk.yellow('To use this template, you must update following to modules:'))
        console.log()
        for (var i = 0; i < warnings.length; i++) {
          var warning = warnings[i]
          console.log('  ' + warning)
        }
        console.log()
        process.exit(1)
      }
    }
    
    

    之后,引用config配置文件夹。那么比较重要的 config/index.js得先介绍下。

    index.js

    
    // see http://vuejs-templates.github.io/webpack for documentation.
    var path = require('path')
    
    module.exports = {
      // 构建应用程序时使用的配置
      build: { // 生产环境
        env: require('./prod.env'), // 环境变量,使用config/prod.env.js中定义的编译环境
        index: path.resolve(__dirname, '../dist/index.html'), // html入口文件
        assetsRoot: path.resolve(__dirname, '../dist'), // 应用程序存放的资源路径,本地文件系统上的绝对路径
        assetsSubDirectory: 'static', // 应用程序存放的资源主目录
        assetsPublicPath: './', // 资源发布的根目录,如果资源不是放在宿主机的根目录,一般修改为'./'
        productionSourceMap: true, // 打包的文件,是否打开source-map  true打开 false 不打开
        // Gzip off by default as many popular static hosts such as
        // Surge or Netlify already gzip all static assets for you.
        // Before setting to `true`, make sure to:
        // npm install --save-dev compression-webpack-plugin
        // Gzip默认关闭的。在流行的静态主机 例如Surge或者Netlify已经帮你把所有的静态资源文件都gzip了。 
        // 在设置为'true'之前,请确保安装了插件'compression-webpack-plugin'
        productionGzip: false, // 是否开启gzip
        productionGzipExtensions: ['js', 'css'], // 使用gzip压缩的文件扩展名
        // Run the build command with an extra argument to
        // View the bundle analyzer report after build finishes:
        // `npm run build --report`
        // Set to `true` or `false` to always turn it on or off
        // 使用一个额外的参数运行构建命令
        // 构建完成后,异步查看包分析报告。
        // `npm run build --report`
        // 设置'true'或者'false'来控制它的'执行'或'关闭'
        bundleAnalyzerReport: process.env.npm_config_report
      },
      dev: { // 开发环境
        env: require('./dev.env'),  // 环境变量,使用config/dev.env.js中定义的编译环境
        port: 8017, // 运行测试页面时候的端口号
        autoOpenBrowser: true, // 是否自动打开浏览器。true 是,false 否
        assetsSubDirectory: 'static', // 应用程序存放的资源主目录 
        assetsPublicPath: '/', // 编译发布的根目录,可配置为资源服务器域名或 CDN 域名
        proxyTable: {}, // 需要 proxyTable 代理的接口(可跨域)
        // CSS Sourcemaps off by default because relative paths are "buggy"
        // with this option, according to the CSS-Loader README
        // (https://github.com/webpack/css-loader#sourcemaps)
        // In our experience, they generally work as expected,
        // just be aware of this issue when enabling this option.
        cssSourceMap: false // 是否开启cssSourceMap,默认是false关闭的
      }
    }
    
    

    这个之后,再来看看 webpack.base.conf.js

    webpack.base.conf.js

    // webpack的基本配置文件
    // 1:配置webpack入口文件
    // 2:配置webpack输出路径和命名规则
    // 3: 配置模块resolve规则
    // 4: 配置不同类型模块的处理规则
    var path = require('path')
    var utils = require('./utils')
    var config = require('../config') // 获取配置
    var vueLoaderConfig = require('./vue-loader.conf') // 获取loader配置
    
    // 获取绝对路径
    function resolve (dir) {
      return path.join(__dirname, '..', dir)
    }
    
    module.exports = {
      // 入口起点。这里应用程序开始执行,webpack 开始打包
      entry: {
        app: './src/main.js'
      }, 
      // 输出。webpack如何输出结果的相关选项
      output: {
        path: config.build.assetsRoot, // 所有输出文件的目标路径。必须是绝对路径
        filename: '[name].js', // 入口分块(entry chunk) 的文件名模块
        // 输出解析文件的目录。 url 相对于 HTML 页面
        publicPath: process.env.NODE_ENV === 'production'
          ? config.build.assetsPublicPath
          : config.dev.assetsPublicPath
      },
      // 解析模块请求的选项 (不适用于对 loader 解析)
      resolve: {
        // 使用的扩展名
        extensions: ['.js', '.vue', '.json'],
        // 模块别名列表,使用别名,方便引用模块
        alias: {
          // 起别名 'vue$' -> 'vue/dist/vue.esm.js'
          'vue$': 'vue/dist/vue.esm.js',
          // 起别名: '@' ->  'src的绝对路径'
          '@': resolve('src')
        }
      },
      // 模块配置
      module: {
        // 模块规则(配置 loader、解析器等选项)
        
        // 匹配条件,每个选项都接收一个正则表达式或字符串
        // test 和 inclue 具有相同的作用, 都是必须匹配选项
        // exclude 是必不匹配选项(优先于 test 和 include)
        // 最佳实践:
        // - 只在 test 和 文件名匹配 中使用正则表达式
        // - 在 include 和 exclude 中使用绝对路径数组
        // - 尽量避免 exclude,更倾向于使用 include
        rules: [
          {
            // 对所有.vue文件使用vue-loader进行编译
            test: /.vue$/, 
            loader: 'vue-loader', // 应该应用的loader,它相对上下文解析
            options: vueLoaderConfig  // loader的可选项
          },
          {
            // 对src和test文件夹下的.js文件使用babel-loader将es6+的代码转成es5
            test: /.js$/,
            loader: 'babel-loader',
            include: [resolve('src'), resolve('test')]
          },
          {
            // 对图片资源文件使用url-loader
            test: /.(png|jpe?g|gif|svg)(?.*)?$/,
            loader: 'url-loader',
            options: {
              // 小于10k的图片转成base64编码的dataURL字符串写到代码中
              // 其他的图片转移到静态资源文件夹img/
              limit: 10000,
              name: utils.assetsPath('img/[name].[hash:7].[ext]')
            }
          },
          {
            // 对字体资源文件使用url-loader
            test: /.(woff2?|eot|ttf|otf)(?.*)?$/,
            loader: 'url-loader',
            options: {
              // 小于10K的资源转成base64编码的dataURL字符串写到代码中
              // 其他的资源转移到静态资源文件夹fonts/
              limit: 10000,
              name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
            }
          }
        ]
      }
    }
    
    

    其他几个小文件,就不一一列举出来了,更多详细解析,请查看源码:
    webpack模版配置分析

  • 相关阅读:
    Xcode 8.2 想使用插件 怎么办? 教你科学的使用插件
    JSAPI_Ticket签名
    Java中HashMap,LinkedHashMap,TreeMap的区别[转]
    微信支付开发,再次签名,APP调用
    微信支付开发,统一下单
    android studio安装插件
    java实现mysql数据库的备份及还原
    java项目中读取src目录下的文件
    eclipse增加浏览器chrome
    cd 命令
  • 原文地址:https://www.cnblogs.com/weiqinl/p/7650419.html
Copyright © 2020-2023  润新知