介绍vue-cli脚手架config目录下index.js配置文件

1、config/index.js

var path = require(‘path‘)

module.exports = {
  build: { // production 环境
    env: require(‘./prod.env‘), // 使用 config/prod.env.js 中定义的编译环境
    index: path.resolve(__dirname, ‘../dist/index.html‘), // 编译输入的 index.html 文件
    assetsRoot: path.resolve(__dirname, ‘../dist‘), // 编译输出的静态资源路径
    assetsSubDirectory: ‘static‘, // 编译输出的二级目录
    assetsPublicPath: ‘/‘, // 编译发布的根目录,可配置为资源服务器域名或 CDN 域名
    productionSourceMap: false, // 是否开启 cssSourceMap
    // 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
    productionGzip: false, // 是否开启 gzip
    productionGzipExtensions: [‘js‘, ‘css‘] // 需要使用 gzip 压缩的文件扩展名
  },
  dev: { // dev 环境
    env: require(‘./dev.env‘), // 使用 config/dev.env.js 中定义的编译环境
    port: 8080, // 运行测试页面的端口
    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
  }
}

2、build/build.js页面

require(‘./check-versions‘)()// 检查 Node 和 npm 版本

process.env.NODE_ENV = ‘production‘

const ora = require(‘ora‘) // 一个很好看的 loading 插件
const path = require(‘path‘)
const config = require(‘../config‘)//加载config.js
const webpack = require(‘webpack‘)//加载webpack
const webpackConfig = require(‘./webpack.prod.conf‘)// 加载 webpack.prod.conf

console.log( //  输出提示信息 ~ 提示用户请在 http 服务下查看本页面,否则为空白页
  ‘  Tip:\n‘ +
  ‘  Built files are meant to be served over an HTTP server.\n‘ +
  ‘  Opening index.html over file:// won\‘t work.\n‘
)

var spinner = ora(‘building for production...‘)  // 使用 ora 打印出 loading + log
spinner.start()  // 开始 loading 动画

/* 拼接编译输出文件路径 */
var assetsPath = path.join(config.build.assetsRoot, config.build.assetsSubDirectory)
rm(‘-rf‘, assetsPath) /* 删除这个文件夹 (递归删除) */
mkdir(‘-p‘, assetsPath) /* 创建此文件夹 */
cp(‘-R‘, ‘static/*‘, assetsPath) /* 复制 static 文件夹到我们的编译输出目录 */

webpack(webpackConfig, function (err, stats) {  //  开始 webpack 的编译
  // 编译成功的回调函数
  spinner.stop()
  if (err) throw err
  process.stdout.write(stats.toString({
      colors: true,
      modules: false,
      children: false,
      chunks: false,
      chunkModules: false
    }) + ‘\n‘)
})

3、build/webpack.base.conf.js

var path = require(‘path‘)
var config = require(‘../config‘)
var utils = require(‘./utils‘)
var projectRoot = path.resolve(__dirname, ‘../‘)

var env = process.env.NODE_ENV
// check env & config/index.js to decide weither to enable CSS Sourcemaps for the
// various preprocessor loaders added to vue-loader at the end of this file
var cssSourceMapDev = (env === ‘development‘ && config.dev.cssSourceMap)/* 是否在 dev 环境下开启 cssSourceMap ,在 config/index.js 中可配置 */
var cssSourceMapProd = (env === ‘production‘ && config.build.productionSourceMap)/* 是否在 production 环境下开启 cssSourceMap ,在 config/index.js 中可配置 */
var useCssSourceMap = cssSourceMapDev || cssSourceMapProd /* 最终是否使用 cssSourceMap */

module.exports = {
  entry: utils.getEntries(‘./src/module/**/*.js‘),// 配置webpack编译入口
  output: {// 配置webpack输出路径和命名规则
    path: config.build.assetsRoot,// webpack输出的目标文件夹路径(例如:/dist)
    publicPath: process.env.NODE_ENV === ‘production‘ ? config.build.assetsPublicPath : config.dev.assetsPublicPath,
    filename: ‘[name].js‘// webpack输出bundle文件命名格式,基于文件的md5生成Hash名称的script来防止缓存
  },
  resolve: {
    extensions: [‘‘, ‘.js‘, ‘.vue‘],//自动解析确定的拓展名,使导入模块时不带拓展名
    fallback: [path.join(__dirname, ‘../node_modules‘)],
    alias: {// 创建import或require的别名,一些常用的,路径长的都可以用别名
      ‘vue$‘: ‘vue/dist/vue.common.js‘,
      ‘src‘: path.resolve(__dirname, ‘../src‘),
      ‘assets‘: path.resolve(__dirname, ‘../src/assets‘),
      ‘components‘: path.resolve(__dirname, ‘../src/components‘)
    }
  },
  resolveLoader: {
    fallback: [path.join(__dirname, ‘../node_modules‘)]
  },
  module: {
    loaders: [
      {
        test: /\.vue$/, // vue文件后缀
        loader: ‘vue‘   //使用vue-loader处理
      },
      {
        test: /\.js$/,
        loader: ‘babel‘,
        include: projectRoot,
        exclude: /node_modules/
      },
      {
        test: /\.json$/,
        loader: ‘json‘
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: ‘url‘,
        query: {
          limit: 500000,
          name: utils.assetsPath(‘img/[name].[hash:7].[ext]‘)
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: ‘url‘,
        query: {
          limit: 10000,
          name: utils.assetsPath(‘fonts/[name].[hash:7].[ext]‘)
        }
      }
    ]
  },
  vue: {// .vue 文件配置 loader 及工具 (autoprefixer)
    loaders: utils.cssLoaders({ sourceMap: useCssSourceMap }),// 调用cssLoaders方法返回各类型的样式对象(css: loader)
    postcss: [
      require(‘autoprefixer‘)({
        browsers: [‘last 2 versions‘]
      })
    ]
  }
}

4、build/webpack.prod.conf.js

‘use strict‘
const path = require(‘path‘)
const utils = require(‘./utils‘)
const webpack = require(‘webpack‘)
const config = require(‘../config‘)
const merge = require(‘webpack-merge‘)// 一个可以合并数组和对象的插件
const baseWebpackConfig = require(‘./webpack.base.conf‘)
// 用于从webpack生成的bundle中提取文本到特定文件中的插件
// 可以抽取出css,js文件将其与webpack输出的bundle分离
const HtmlWebpackPlugin = require(‘html-webpack-plugin‘)// 一个用于生成HTML文件并自动注入依赖文件(link/script)的webpack插件
const ExtractTextPlugin = require(‘extract-text-webpack-plugin‘)//如果我们想用webpack打包成一个文件,css js分离开,需要这个插件

var env = config.build.env
// 合并基础的webpack配置
var webpackConfig = merge(baseWebpackConfig, {
  // 配置样式文件的处理规则,使用styleLoaders
  module: {
    loaders: utils.styleLoaders({ sourceMap: config.build.productionSourceMap, extract: true })
  },
  devtool: config.build.productionSourceMap ? ‘#source-map‘ : false, // 开启source-map,生产环境下推荐使用cheap-source-map或source-map,后者得到的.map文件体积比较大,但是能够完全还原以前的js代码
  output: {
    path: config.build.assetsRoot,// 编译输出目录
    filename: utils.assetsPath(‘js/[name].[chunkhash].js‘),  // 编译输出文件名格式
    chunkFilename: utils.assetsPath(‘js/[id].[chunkhash].js‘)  // 没有指定输出名的文件输出的文件名格式
  },
  vue: { // vue里的css也要单独提取出来
    loaders: utils.cssLoaders({ // css加载器,调用了utils文件中的cssLoaders方法,用来返回针对各类型的样式文件的处理方式,
      sourceMap: config.build.productionSourceMap,
      extract: true
    })
  },
  // 重新配置插件项
  plugins: [
    // http://vuejs.github.io/vue-loader/en/workflow/production.html
    // 位于开发环境下
    new webpack.DefinePlugin({
      ‘process.env‘: env
    }),
    new webpack.optimize.UglifyJsPlugin({// 丑化压缩代码
      compress: {
        warnings: false
      }
    }),
    new webpack.optimize.OccurenceOrderPlugin(),
    // extract css into its own file
    new ExtractTextPlugin(utils.assetsPath(‘css/[name].[contenthash].css‘)),  // 抽离css文件
    // generate dist index.html with correct asset hash for caching.
    // you can customize output by editing /index.html
    // see https://github.com/ampedandwired/html-webpack-plugin
    // filename 生成网页的HTML名字,可以使用/来控制文件文件的目录结构,最
    // 终生成的路径是基于webpac配置的output.path的
   /* new HtmlWebpackPlugin({
      // 生成html文件的名字,路径和生产环境下的不同,要与修改后的publickPath相结合,否则开启服务器后页面空白
      filename: config.build.index,
      // 源文件,路径相对于本文件所在的位置
      template: ‘index.html‘,
      inject: true,// 要把<script>标签插入到页面哪个标签里(body|true|head|false)
      minify: {
        removeComments: true,
        collapseWhitespace: true,
        removeAttributeQuotes: true
        // more options:
        // https://github.com/kangax/html-minifier#options-quick-reference
      },
      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
      chunksSortMode: ‘dependency‘
    }),*/
    // 如果文件是多入口的文件,可能存在,重复代码,把公共代码提取出来,又不会重复下载公共代码了
    // (多个页面间会共享此文件的缓存)
    // CommonsChunkPlugin的初始化常用参数有解析?
    // name: 这个给公共代码的chunk唯一的标识
    // filename,如何命名打包后生产的js文件,也是可以用上[name]、[hash]、[chunkhash]
    // minChunks,公共代码的判断标准:某个js模块被多少个chunk加载了才算是公共代码
    // split vendor js into its own file
    new webpack.optimize.CommonsChunkPlugin({
      name: ‘vendor‘,
      minChunks: function (module, count) {
        // any required modules inside node_modules are extracted to vendor
        return (
          module.resource &&
          /\.js$/.test(module.resource) &&
          module.resource.indexOf(
            path.join(__dirname, ‘../node_modules‘)
          ) === 0
        )
      }
    }),
    // extract webpack runtime and module manifest to its own file in order to
    // prevent vendor hash from being updated whenever app bundle is updated
/*    new webpack.optimize.CommonsChunkPlugin({ // 为组件分配ID,通过这个插件webpack可以分析和优先考虑使用最多的模块,并为它们分配最小的ID
      name: ‘manifest‘,
      chunks: [‘vendor‘]
    })*/
  ]
})
// gzip模式下需要引入compression插件进行压缩
if (config.build.productionGzip) {
  var CompressionWebpackPlugin = require(‘compression-webpack-plugin‘)

  webpackConfig.plugins.push(
    new CompressionWebpackPlugin({
      asset: ‘[path].gz[query]‘,
      algorithm: ‘gzip‘,
      test: new RegExp(
        ‘\\.(‘ +
        config.build.productionGzipExtensions.join(‘|‘) +
        ‘)$‘
      ),
      threshold: 10240,
      minRatio: 0.8
    })
  )
}

if (config.build.bundleAnalyzerReport) {
  const BundleAnalyzerPlugin = require(‘webpack-bundle-analyzer‘).BundleAnalyzerPlugin
  webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}

module.exports = webpackConfig

var pages = utils.getEntries(‘./src/module/**/*.html‘)
for(var page in pages) {
  // 配置生成的html文件,定义路径等
  var conf = {
    filename: page + ‘.html‘,
    template: pages[page], //模板路径
    inject: true,
    // excludeChunks 允许跳过某些chunks, 而chunks告诉插件要引用entry里面的哪几个入口
    // 如何更好的理解这块呢?举个例子:比如本demo中包含两个模块(index和about),最好的当然是各个模块引入自己所需的js,
    // 而不是每个页面都引入所有的js,你可以把下面这个excludeChunks去掉,然后npm run build,然后看编译出来的index.html和about.html就知道了
    // filter:将数据过滤,然后返回符合要求的数据,Object.keys是获取JSON对象中的每个key
    excludeChunks: Object.keys(pages).filter(item => {
      return (item != page)
    })
  }
  // 需要生成几个html文件,就配置几个HtmlWebpackPlugin对象
  module.exports.plugins.push(new HtmlWebpackPlugin(conf))
}

原文地址:https://www.cnblogs.com/chenglideyueguang/p/9669696.html

时间: 2024-11-08 15:01:12

介绍vue-cli脚手架config目录下index.js配置文件的相关文章

vue.cli脚手架初次使用图文教程

vue.cli脚手架初次使用图文教程 我之前的环境是安装了node.js, 我记得曾经好像安装过vue ,不过现在又要重新开始学习起来了.在youtube上看了一vue的相关教程,还是需要实操的. 好像安装过npm -v 发现已经安装了5.6.0 需要安装然后使用 cnpm 安装 vue-cli 和 webpack 安装代码:npm install -g vue-cli 一.生成项目 首先需要在命令行中进入到项目目录,然后输入: vue init webpack vue-testone p.p1

gulp插件实现压缩一个文件夹下不同目录下的js文件(支持es6)

gulp-uglify:压缩js大小,只支持es5 安装: cnpm: cnpm i gulp-uglify -D yarn: yarn add gulp-uglify -D 使用: 代码实现1:压缩js文件夹下的index.js文件输出到dist文件夹下面(注意要压缩的js文件中此处只能使用es5) 1 var gulp = require('gulp'); 2 var uglify = require('gulp-uglify'); 3 4 gulp.task("uglify",f

vue cli脚手架项目利用webpack给生产环境和发布环境配置不同的接口地址或者不同的变量值。

废话不多说,直接进入正题,此文以配置不同的接口域名地址为例子 项目根目录下有一个config文件夹,基础项目的话里面至少包括三个文件, 1.dev.env.js 2.index.js 3.prod.env.js 我们需要做配置的就是第一个和第三个. 其实这两个文件内容就是针对生产环境和发布环境设置不同的参数的文件,那么打开dev.en.js,开发环境.原本代码如下: 'use strict' const merge = require('webpack-merge') const prodEnv

web前端 -- vue -- vue cli脚手架

搭建 vue-cli 脚手架 1. 依赖的环境是:node.js 1.1.检测node和npm版本 node.js 官网下载页,选择 windows 系统 msi 安装版本,一路 next 安装. 要有6.9以上的node:node-v 要有3.10以上的npm:npm -v 附:安装node.js 1.2. 安装全局 vue cli Linux下使用命令:sudo npm install --global vue-cli windows下:npm install --global vue-cl

用 vue cli 脚手架搭建单页面 Vue 应用(进阶2)

1.配置 Node 环境. 自行百度吧. 安装好了之后,打开 cmd .运行 node -v .显示版本号,就是安装成功了. 注:不要安装8.0.0以上的版本,和 vue-cli 不兼容. 我使用的 6.10.3 的版本,相对稳定. 2.使用 npm 管理依赖 使用 node 自带的包管理工具 npm 管理项目中的依赖,由于 npm 的服务器在国外.经常会遇到速度奇慢或者下载不下来依赖的情况,所以推荐使用淘宝镜像. npm install-g cnpm--registry=https://reg

vue cli 脚手架上多页面开发 支持webpack2.x

A yuri demo for webpack2 vue multiple page.我看到有一些项目多页面项目是基于webapck1.0的,我这个是在webpack2.x上布置修改. 项目地址: https://github.com/yurizhang/vue_multiple_page   直接拉下来看代码就好,没几行修改. 主要修改:几个文件即可 ,主要是node.js代码,使用beyond file compare比较一下即可. 项目地址: https://github.com/yuri

在web目录下 批量寻找配置文件信息

dir /s /b *.php *.inc *.conf *.config >>list.txt" W4 I2 U+ N/ B6 K @0 r r8 ^ T00LS: _$ j! ^3 N2 x' F7 x for /f "tokens=*" %i in (list.txt) do php php findpass.php "%i" >>info.txt( T/ a$ E" R- W. O <?php isset($

Java读取WEB-INF目录下的properties配置文件

文件位置: 代码: public static Properties getProperties(){ Properties pts = new Properties (); FileInputStream in = null; try{ String path = UtilManager.class.getResource("/").getPath(); String websiteURL = (path.replace("/build/classes", &qu

Vue通过build打包后 打开index.html页面是空白的

最近在build打包vue项目遇到了几个问题,如下: 1.npm run build打包项目之后,我们通常是把dist文件里面被压缩后的static文件跟index.html提交到服务器,但最近发现直接打开index.html页面是空白的,还会报几个错,找不到页面路径. 原因:找到config文件下index.js,全局搜索assetsPublicPath,结果是 assetsPublicPath:' / ' 默认为根目录,而index.html和static是在同一级目录下,因此,解决方法就是