不是原創,真的不是原創,主要我是根據CSDN的一篇文章和其餘平臺上的文章整理而來,在最後我會貼上全部原文的地址,下面正式進入正文。css
這個是Vue-cli2.0版本的文件目錄結構,整體來講就是以下圖的html
一、build.js文件: 是咱們完成項目以後須要運行的, 能夠將咱們的項目文件打包成 靜態文件,存放在項目根目錄的 dist 文件夾中(如今目錄裏尚未這個文件夾,npm run build的時候會自動生成),固然你能夠本身設置路徑,是在 config 文件夾中的 index.js 中改,能夠指定主頁,默認是 index.html。vue
'use strict' // 調用exports出來的一個函數 require('./check-versions')() // 全局環境變量的設置(默認生產模式) process.env.NODE_ENV = 'production' // ora,一個能夠在終端顯示spinner的插件,就是日誌輸出 const ora = require('ora') // rm,用於刪除文件或文件夾的插件 const rm = require('rimraf') // path,node中默認處理文件路徑的模塊 const path = require('path') // chalk,用於在控制檯輸出帶顏色字體的插件 const chalk = require('chalk') const webpack = require('webpack') // config,項目配置文件 const config = require('../config') // 加載生產包的配置 const webpackConfig = require('./webpack.prod.conf') const spinner = ora('building for production...') // 開啓loading動畫 spinner.start() // 首先將整個dist文件夾以及裏面的內容刪除,以避免遺留舊的沒用的文件 // 刪除完成後纔開始webpack構建打包 rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { if(err) throw err // 執行webpack構建打包,完成以後在終端輸出構建完成的相關信息或者輸出報錯信息並退出程序 webpack(webpackConfig, (err, stats) => { spinner.stop() if(err) throw err process.stdout.write(stats.toString({ colors: true, modules: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. children: false, chunks: false, chunkModules: false }) + '\n\n') if(stats.hasErrors()) { console.log(chalk.red(' Build failed with errors.\n')) process.exit(1) } console.log(chalk.cyan(' Build complete.\n')) console.log(chalk.yellow(' Tip: built files are meant to be served over an HTTP server.\n' + ' Opening index.html over file:// won\'t work.\n')) }) })
二、check-version.js文件: 主要是檢查一些所依賴的工具的版本是否適用,如nodejs、npm,若版本過低則會提示出來。node
'use strict' // chalk,用於在控制檯輸出帶顏色字體的插件 const chalk = require('chalk') // 引入版本檢查工具 const semver = require('semver') const packageConfig = require('../package.json') const shell = require('shelljs') function exec(cmd) { return require('child_process').execSync(cmd).toString().trim() } const 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() { const warnings = [] for(let i = 0; i < versionRequirements.length; i++) { const mod = versionRequirements[i] // 檢查版本是否合法 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(let i = 0; i < warnings.length; i++) { const warning = warnings[i] console.log(' ' + warning) } console.log() process.exit(1) } }
三、utils.js文件: 一個功能模塊,以便於解析各類格式的css,如 less,sass 什麼的。webpack
'use strict' const path = require('path') const config = require('../config') // 這裏用來提取css樣式 // extract-text-webpack-plugin能夠提取bundle中的特定文本,將提取後的文本單獨存放到另外的文件 const ExtractTextPlugin = require('extract-text-webpack-plugin') const packageConfig = require('../package.json') // 資源文件的存放路徑 exports.assetsPath = function(_path) { const assetsSubDirectory = process.env.NODE_ENV === 'production' ? config.build.assetsSubDirectory : config.dev.assetsSubDirectory return path.posix.join(assetsSubDirectory, _path) } // 生成css、sass、scss等各類用來編寫樣式的語言所對應的loader配置 exports.cssLoaders = function(options) { options = options || {} // css-loader配置 const cssLoader = { loader: 'css-loader', options: { // 是否使用source-map sourceMap: options.sourceMap } } const postcssLoader = { loader: 'postcss-loader', options: { sourceMap: options.sourceMap } } // generate loader string to be used with extract text plugin // 生成各類loader配置,而且配置了extract-text-pulgin function generateLoaders(loader, loaderOptions) { const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] // 例如generateLoaders('less'),這裏就會push一個less-loader // less-loader先將less編譯成css,而後再由css-loader去處理css // 其餘sass、scss等語言也是同樣的過程 if(loader) { loaders.push({ loader: loader + '-loader', options: Object.assign({}, loaderOptions, { sourceMap: options.sourceMap }) }) } // Extract CSS when that option is specified // (which is the case during production build) if(options.extract) { // 配置extract-text-plugin提取樣式 return ExtractTextPlugin.extract({ use: loaders, fallback: 'vue-style-loader' }) } else { // 無需提取樣式則簡單使用vue-style-loader配合各類樣式loader去處理<style>裏面的樣式 return ['vue-style-loader'].concat(loaders) } } // https://vue-loader.vuejs.org/en/configurations/extract-css.html // 獲得各類不一樣處理樣式的語言所對應的loader return { css: generateLoaders(), postcss: generateLoaders(), less: generateLoaders('less'), sass: generateLoaders('sass', { indentedSyntax: true }), scss: generateLoaders('sass'), stylus: generateLoaders('stylus'), styl: generateLoaders('stylus') } } // Generate loaders for standalone style files (outside of .vue) // 生成處理單獨的.css、.sass、.scss等樣式文件的規則 exports.styleLoaders = function(options) { const output = [] const loaders = exports.cssLoaders(options) for(const extension in loaders) { const loader = loaders[extension] output.push({ test: new RegExp('\\.' + extension + '$'), use: loader }) } return output } exports.createNotifierCallback = () => { const notifier = require('node-notifier') return(severity, errors) => {