vue-cli的webpack模板項目配置文件說明


如果沒有vue-cli,那么進行vue項目的開發環境配置將是很費力的一件事情,現在腳手架可以快速構建一個開發環境,是很不錯的。不過對於腳手架構建的配置,還是要大概了解一下,方便自己調試配置。

初始化一個vue項目操作命令如下:

# 全局安裝 vue-cli
$ npm install --global vue-cli

# 創建一個基於 webpack 模板的新項目
$ vue init webpack my-project

# 安裝依賴
$ cd my-project
$ npm install
$ npm run dev

 

一般來說,vue-cli構建項目時候回生成類似下面的項目文件結構:

 

├─build
│   ├─build.js
│   ├─check-versions.js
│   ├─dev-client.js
│   ├─dev-server.js
│   ├─utils.js
│   ├─vue-loader.conf.js
│   ├─webpack.base.conf.js
│   ├─webpack.dev.conf.js
│   ├─webpack.prod.conf.js
├─config
│   ├─dev.env.js
│   ├─index.js
│   ├─prod.env.js
├─...
└─package.json

 

一、項目指令

 

我們可以在package.json里面的看到scripts字段是這樣:

"scripts": {
  "dev": "node build/dev-server.js",
  "build": "node build/build.js",
  "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",
  "e2e": "node test/e2e/runner.js",
  "test": "npm run unit && npm run e2e",
  "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs"
 }

這里包含開發運行,項目打包,單元測試等命令,測試的東西先放一邊,看dev和build命令。運行”npm run dev”的時候執行的是build/dev-server.js文件,運行”npm run build”的時候執行的是build/build.js文件,我們可以從這兩個文件開始進行代碼閱讀分析。

 

二、build文件夾配置

 

1、build/dev-server.js

這個文件主要是完成下面操作:

1 檢查node和npm的版本
2 引入相關插件和配置
3 創建express服務器和webpack編譯器
4 配置開發中間件(webpack-dev-middleware)和熱重載中間件(webpack-hot-middleware)
5 掛載代理服務和中間件
6 配置靜態資源
7 啟動服務器監聽特定端口(80808 自動打開瀏覽器並打開特定網址(localhost:8080)

Ps:express服務器提供靜態文件服務,不過它還使用了http-proxy-middleware,一個http請求代理的中間件。前端開發過程中需要使用到后台的API的話,可以通過配置proxyTable來將相應的后台請求代理到專用的API服務器。

代碼配置注釋:

  1 // 檢查NodeJS和npm的版本
  2 require('./check-versions')()
  3 
  4 // 獲取配置
  5 var config = require('../config')
  6 // 如果Node的環境變量中沒有設置當前的環境(NODE_ENV),則使用config中的配置作為當前的環境
  7 if (!process.env.NODE_ENV) {
  8   process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
  9 }
 10 
 11 // 一個可以調用默認軟件打開網址、圖片、文件等內容的插件
 12 // 這里用它來調用默認瀏覽器打開dev-server監聽的端口,例如:localhost:8080
 13 var opn = require('opn')
 14 var path = require('path')
 15 var express = require('express')
 16 var webpack = require('webpack')
 17 
 18 // 一個express中間件,用於將http請求代理到其他服務器
 19 // 例:localhost:8080/api/xxx  -->  localhost:3000/api/xxx
 20 // 這里使用該插件可以將前端開發中涉及到的請求代理到API服務器上,方便與服務器對接
 21 var proxyMiddleware = require('http-proxy-middleware')
 22 
 23 // 根據 Node 環境來引入相應的 webpack 配置
 24 var webpackConfig = process.env.NODE_ENV === 'testing'
 25   ? require('./webpack.prod.conf')
 26   : require('./webpack.dev.conf')
 27 
 28 // dev-server 監聽的端口,默認為config.dev.port設置的端口,即8080
 29 var port = process.env.PORT || config.dev.port
 30 
 31 // 用於判斷是否要自動打開瀏覽器的布爾變量,當配置文件中沒有設置自動打開瀏覽器的時候其值為 false
 32 var autoOpenBrowser = !!config.dev.autoOpenBrowser
 33 
 34 // 定義 HTTP 代理表,代理到 API 服務器
 35 var proxyTable = config.dev.proxyTable
 36 
 37 // 創建1個 express 實例
 38 var app = express()
 39 
 40 // 根據webpack配置文件創建Compiler對象
 41 var compiler = webpack(webpackConfig)
 42 
 43 // webpack-dev-middleware使用compiler對象來對相應的文件進行編譯和綁定
 44 // 編譯綁定后將得到的產物存放在內存中而沒有寫進磁盤
 45 // 將這個中間件交給express使用之后即可訪問這些編譯后的產品文件
 46 var devMiddleware = require('webpack-dev-middleware')(compiler, {
 47   publicPath: webpackConfig.output.publicPath,
 48   quiet: true
 49 })
 50 
 51 // webpack-hot-middleware,用於實現熱重載功能的中間件
 52 var hotMiddleware = require('webpack-hot-middleware')(compiler, {
 53   log: () => {}
 54 })
 55 
 56 // 當html-webpack-plugin提交之后通過熱重載中間件發布重載動作使得頁面重載
 57 compiler.plugin('compilation', function (compilation) {
 58   compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
 59     hotMiddleware.publish({ action: 'reload' })
 60     cb()
 61   })
 62 })
 63 
 64 // 將 proxyTable 中的代理請求配置掛在到express服務器上
 65 Object.keys(proxyTable).forEach(function (context) {
 66   var options = proxyTable[context]
 67   // 格式化options,例如將'www.example.com'變成{ target: 'www.example.com' }
 68   if (typeof options === 'string') {
 69     options = { target: options }
 70   }
 71   app.use(proxyMiddleware(options.filter || context, options))
 72 })
 73 
 74 // handle fallback for HTML5 history API
 75 // 重定向不存在的URL,常用於SPA
 76 app.use(require('connect-history-api-fallback')())
 77 
 78 // serve webpack bundle output
 79 // 使用webpack開發中間件
 80 // 即將webpack編譯后輸出到內存中的文件資源掛到express服務器上
 81 app.use(devMiddleware)
 82 
 83 // enable hot-reload and state-preserving
 84 // compilation error display
 85 // 將熱重載中間件掛在到express服務器上
 86 app.use(hotMiddleware)
 87 
 88 // serve pure static assets
 89 // 靜態資源的路徑
 90 var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
 91 
 92 // 將靜態資源掛到express服務器上
 93 app.use(staticPath, express.static('./static'))
 94 
 95 // 應用的地址信息,例如:http://localhost:8080
 96 var uri = 'http://localhost:' + port
 97 
 98 // webpack開發中間件合法(valid)之后輸出提示語到控制台,表明服務器已啟動
 99 devMiddleware.waitUntilValid(function () {
100   console.log('> Listening at ' + uri + '\n')
101 })
102 
103 // 啟動express服務器並監聽相應的端口(8080)
104 module.exports = app.listen(port, function (err) {
105   if (err) {
106     console.log(err)
107     return
108   }
109 
110   // when env is testing, don't need open it
111   // 如果符合自動打開瀏覽器的條件,則通過opn插件調用系統默認瀏覽器打開對應的地址uri
112   if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
113     opn(uri)
114   }
115 })

2、build/webpack.base.conf.js

從代碼中看到,dev-server使用的webpack配置來自build/webpack.dev.conf.js文件(測試環境下使用的是build/webpack.prod.conf.js,這里暫時不考慮測試環境)。而build/webpack.dev.conf.js中又引用了webpack.base.conf.js,所以這里先看webpack.base.conf.js。

webpack.base.conf.js主要完成下面的操作:

1 配置webpack編譯入口
2 配置webpack輸出路徑和命名規則
3 配置模塊resolve規則
4 配置不同類型模塊的處理規則

代碼配置注釋:

 1 var path = require('path')
 2 var utils = require('./utils')
 3 var config = require('../config')
 4 var vueLoaderConfig = require('./vue-loader.conf')
 5 
 6 // 給出正確的絕對路徑
 7 function resolve (dir) {
 8   return path.join(__dirname, '..', dir)
 9 }
10 
11 module.exports = {
12   // 配置webpack編譯入口
13   entry: {
14     app: './src/main.js'
15   },
16 
17   // 配置webpack輸出路徑和命名規則
18   output: {
19     // webpack輸出的目標文件夾路徑(例如:/dist)
20     path: config.build.assetsRoot,
21     // webpack輸出bundle文件命名格式
22     filename: '[name].js',
23     // webpack編譯輸出的發布路徑
24     publicPath: process.env.NODE_ENV === 'production'
25       ? config.build.assetsPublicPath
26       : config.dev.assetsPublicPath
27   },
28 
29   // 配置模塊resolve的規則
30   resolve: {
31     // 自動resolve的擴展名
32     extensions: ['.js', '.vue', '.json'],
33     // resolve模塊的時候要搜索的文件夾
34     modules: [
35       resolve('src'),
36       resolve('node_modules')
37     ],
38     // 創建路徑別名,有了別名之后引用模塊更方便,例如
39     // import Vue from 'vue/dist/vue.common.js'可以寫成 import Vue from 'vue'
40     alias: {
41       'vue$': 'vue/dist/vue.common.js',
42       'src': resolve('src'),
43       'assets': resolve('src/assets'),
44       'components': resolve('src/components')
45     }
46   },
47 
48   // 配置不同類型模塊的處理規則
49   module: {
50     rules: [
51       {// 對src和test文件夾下的.js和.vue文件使用eslint-loader
52         test: /\.(js|vue)$/,
53         loader: 'eslint-loader',
54         enforce: "pre",
55         include: [resolve('src'), resolve('test')],
56         options: {
57           formatter: require('eslint-friendly-formatter')
58         }
59       },
60       {// 對所有.vue文件使用vue-loader
61         test: /\.vue$/,
62         loader: 'vue-loader',
63         options: vueLoaderConfig
64       },
65       {// 對src和test文件夾下的.js文件使用babel-loader
66         test: /\.js$/,
67         loader: 'babel-loader',
68         include: [resolve('src'), resolve('test')]
69       },
70       {// 對圖片資源文件使用url-loader,query.name指明了輸出的命名規則
71         test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
72         loader: 'url-loader',
73         query: {
74           limit: 10000,
75           name: utils.assetsPath('img/[name].[hash:7].[ext]')
76         }
77       },
78       {// 對字體資源文件使用url-loader,query.name指明了輸出的命名規則
79         test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
80         loader: 'url-loader',
81         query: {
82           limit: 10000,
83           name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
84         }
85       }
86     ]
87   }
88 }

3、build/webpack.dev.conf.js

接下來看webpack.dev.conf.js,這里面在webpack.base.conf的基礎上增加完善了開發環境下面的配置,主要完成下面操作:

1 將hot-reload相關的代碼添加到entry chunks
2 合並基礎的webpack配置
3 使用styleLoaders
4 配置Source Maps
5 配置webpack插件

代碼配置注釋:

 1 var utils = require('./utils')
 2 var webpack = require('webpack')
 3 var config = require('../config')
 4 
 5 // 一個可以合並數組和對象的插件
 6 var merge = require('webpack-merge')
 7 var baseWebpackConfig = require('./webpack.base.conf')
 8 
 9 // 一個用於生成HTML文件並自動注入依賴文件(link/script)的webpack插件
10 var HtmlWebpackPlugin = require('html-webpack-plugin')
11 
12 // 用於更友好地輸出webpack的警告、錯誤等信息
13 var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
14 
15 // add hot-reload related code to entry chunks
16 Object.keys(baseWebpackConfig.entry).forEach(function (name) {
17   baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
18 })
19 
20 // 合並基礎的webpack配置
21 module.exports = merge(baseWebpackConfig, {
22   // 配置樣式文件的處理規則,使用styleLoaders
23   module: {
24     rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
25   },
26 
27   // 配置Source Maps。在開發中使用cheap-module-eval-source-map更快
28   devtool: '#cheap-module-eval-source-map',
29 
30   // 配置webpack插件
31   plugins: [
32     new webpack.DefinePlugin({
33       'process.env': config.dev.env
34     }),
35     // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
36     new webpack.HotModuleReplacementPlugin(),
37     // 后頁面中的報錯不會阻塞,但是會在編譯結束后報錯
38     new webpack.NoEmitOnErrorsPlugin(),
39     // https://github.com/ampedandwired/html-webpack-plugin
40     new HtmlWebpackPlugin({
41       filename: 'index.html',
42       template: 'index.html',
43       inject: true
44     }),
45     new FriendlyErrorsPlugin()
46   ]
47 })

4、build/utils.js

utils主要完成下面3個操作:

1 配置靜態資源路徑
2 生成cssLoaders用於加載.vue文件中的樣式
3 生成styleLoaders用於加載不在.vue文件中的單獨存在的樣式文件

5、build/vue-loader.conf.js

vue-loader.conf則只配置了css加載器以及編譯css之后自動添加前綴。

代碼配置注釋:

var utils = require('./utils')
var config = require('../config')
var isProduction = process.env.NODE_ENV === 'production'

module.exports = {
  // css加載器
  loaders: utils.cssLoaders({
    sourceMap: isProduction
      ? config.build.productionSourceMap
      : config.dev.cssSourceMap,
    extract: isProduction
  }),

  // 讓 vue-loader 知道需要對 audio 的 src 屬性的內容轉換為模塊
  transformToRequire: {
    video: ‘src‘,
    source: ‘src‘,
    img: ‘src‘,
    image: ‘xlink:href‘
  }
}

6、build/build.js

build.js主要完成下面操作:

1 loading動畫
2 刪除創建目標文件夾
3 webpack編譯
4 輸出信息

Ps: webpack編譯之后會輸出到配置里面指定的目標文件夾;刪除目標文件夾之后再創建是為了去除舊的內容,以免產生不可預測的影響。

代碼配置注釋:

 1 // 檢查NodeJS和npm的版本
 2 require('./check-versions')()
 3 
 4 process.env.NODE_ENV = 'production'
 5 
 6 //ora插件,實現node.js 命令行環境的 loading效果, 和顯示各種狀態的圖標等
 7 var ora = require('ora')
 8 var rm = require('rimraf')
 9 var path = require('path')
10 
11 // 用於在控制台輸出帶顏色字體的插件
12 var chalk = require('chalk')
13 
14 var webpack = require('webpack')
15 var config = require('../config')
16 var webpackConfig = require('./webpack.prod.conf')
17 
18 var spinner = ora('building for production...')
19 spinner.start()
20 
21 //rimraf插件,每次啟動編譯或者打包之前,先把整個dist文件夾刪除,然后再重新生成dist
22 rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
23   if (err) throw err
24   webpack(webpackConfig, function (err, stats) {
25     spinner.stop()
26     if (err) throw err
27     process.stdout.write(stats.toString({
28       colors: true,
29       modules: false,
30       children: false,
31       chunks: false,
32       chunkModules: false
33     }) + '\n\n')
34 
35     console.log(chalk.cyan('  Build complete.\n'))
36     console.log(chalk.yellow(
37       '  Tip: built files are meant to be served over an HTTP server.\n' +
38       '  Opening index.html over file:// won\'t work.\n'
39     ))
40   })
41 })

7、build/webpack.prod.conf.js

構建的時候用到的webpack配置來自webpack.prod.conf.js,該配置同樣是在webpack.base.conf基礎上的進一步完善。主要完成下面操作:

1 合並基礎的webpack配置
2 使用styleLoaders
3 配置webpack的輸出
4 配置webpack插件
5 gzip模式下的webpack插件配置
6 webpack-bundle分析

代碼配置注釋:

  1 var path = require('path')
  2 var utils = require('./utils')
  3 var webpack = require('webpack')
  4 var config = require('../config')
  5 var merge = require('webpack-merge')
  6 var baseWebpackConfig = require('./webpack.base.conf')
  7 var HtmlWebpackPlugin = require('html-webpack-plugin')
  8 
  9 // 用於從webpack生成的bundle中提取文本到特定文件中的插件
 10 // 可以抽取出css,js文件將其與webpack輸出的bundle分離
 11 var ExtractTextPlugin = require('extract-text-webpack-plugin')
 12 
 13 var env = process.env.NODE_ENV === 'testing'
 14   ? require('../config/test.env')
 15   : config.build.env
 16 
 17 // 合並基礎的webpack配置
 18 var webpackConfig = merge(baseWebpackConfig, {
 19   module: {
 20     rules: utils.styleLoaders({
 21       sourceMap: config.build.productionSourceMap,
 22       extract: true
 23     })
 24   },
 25   devtool: config.build.productionSourceMap ? '#source-map' : false,
 26   // 配置webpack的輸出
 27   output: {
 28     // 編譯輸出目錄
 29     path: config.build.assetsRoot,
 30     // 編譯輸出文件名格式
 31     filename: utils.assetsPath('js/[name].[chunkhash].js'),
 32     // 沒有指定輸出名的文件輸出的文件名格式
 33     chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
 34   },
 35 
 36   // 配置webpack插件
 37   plugins: [
 38     // http://vuejs.github.io/vue-loader/en/workflow/production.html
 39     new webpack.DefinePlugin({
 40       'process.env': env
 41     }),
 42 
 43     // 丑化壓縮代碼
 44     new webpack.optimize.UglifyJsPlugin({
 45       compress: {
 46         warnings: false
 47       },
 48       sourceMap: true
 49     }),
 50 
 51     // 抽離css文件
 52     new ExtractTextPlugin({
 53       filename: utils.assetsPath('css/[name].[contenthash].css')
 54     }),
 55 
 56     // generate dist index.html with correct asset hash for caching.
 57     // you can customize output by editing /index.html
 58     // see https://github.com/ampedandwired/html-webpack-plugin
 59     new HtmlWebpackPlugin({
 60       filename: process.env.NODE_ENV === 'testing'
 61         ? 'index.html'
 62         : config.build.index,
 63       template: 'index.html',
 64       inject: true,
 65       minify: {
 66         removeComments: true,
 67         collapseWhitespace: true,
 68         removeAttributeQuotes: true
 69         // more options:
 70         // https://github.com/kangax/html-minifier#options-quick-reference
 71       },
 72       // necessary to consistently work with multiple chunks via CommonsChunkPlugin
 73       chunksSortMode: 'dependency'
 74     }),
 75 
 76     // split vendor js into its own file
 77     new webpack.optimize.CommonsChunkPlugin({
 78       name: 'vendor',
 79       minChunks: function (module, count) {
 80         // any required modules inside node_modules are extracted to vendor
 81         return (
 82           module.resource &&
 83           /\.js$/.test(module.resource) &&
 84           module.resource.indexOf(
 85             path.join(__dirname, '../node_modules')
 86           ) === 0
 87         )
 88       }
 89     }),
 90     // extract webpack runtime and module manifest to its own file in order to
 91     // prevent vendor hash from being updated whenever app bundle is updated
 92     new webpack.optimize.CommonsChunkPlugin({
 93       name: 'manifest',
 94       chunks: ['vendor']
 95     })
 96   ]
 97 })
 98 
 99 // gzip模式下需要引入compression插件進行壓縮
100 if (config.build.productionGzip) {
101   var CompressionWebpackPlugin = require('compression-webpack-plugin')
102   webpackConfig.plugins.push(
103     new CompressionWebpackPlugin({
104       asset: '[path].gz[query]',
105       algorithm: 'gzip',
106       test: new RegExp(
107         '\\.(' +
108         config.build.productionGzipExtensions.join('|') +
109         ')$'
110       ),
111       threshold: 10240,
112       minRatio: 0.8
113     })
114   )
115 }
116 
117 if (config.build.bundleAnalyzerReport) {
118   var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
119   webpackConfig.plugins.push(new BundleAnalyzerPlugin())
120 }
121 
122 module.exports = webpackConfig

8、build/check-versions.js

check-version.js完成對node和npm的版本檢測。

代碼配置注釋:

 1 // 用於在控制台輸出帶顏色字體的插件
 2 var chalk = require('chalk')
 3 
 4 // 語義化版本檢查插件(The semantic version parser used by npm)
 5 var semver = require('semver')
 6 
 7 // 引入package.json
 8 var packageConfig = require('../package.json')
 9 
10 // 開辟子進程執行指令cmd並返回結果
11 function exec (cmd) {
12   return require('child_process').execSync(cmd).toString().trim()
13 }
14 
15 // node和npm版本需求
16 var versionRequirements = [
17   {
18     name: 'node',
19     currentVersion: semver.clean(process.version),
20     versionRequirement: packageConfig.engines.node
21   },
22   {
23     name: 'npm',
24     currentVersion: exec('npm --version'),
25     versionRequirement: packageConfig.engines.npm
26   }
27 ]
28 
29 module.exports = function () {
30   var warnings = []
31   // 依次判斷版本是否符合要求
32   for (var i = 0; i < versionRequirements.length; i++) {
33     var mod = versionRequirements[i]
34     if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
35       warnings.push(mod.name + ': ' +
36         chalk.red(mod.currentVersion) + ' should be ' +
37         chalk.green(mod.versionRequirement)
38       )
39     }
40   }
41 
42   // 如果有警告則將其輸出到控制台
43   if (warnings.length) {
44     console.log('')
45     console.log(chalk.yellow('To use this template, you must update following to modules:'))
46     console.log()
47     for (var i = 0; i < warnings.length; i++) {
48       var warning = warnings[i]
49       console.log('  ' + warning)
50     }
51     console.log()
52     process.exit(1)
53   }
54 }

 

三、config文件夾

 

1、config/index.js

config文件夾下最主要的文件就是index.js了,在這里面描述了開發和構建兩種環境下的配置,前面的build文件夾下也有不少文件引用了index.js里面的配置。

代碼配置注釋:

 1 // see http://vuejs-templates.github.io/webpack for documentation.
 2 var path = require('path')
 3 
 4 module.exports = {
 5   // 構建產品時使用的配置
 6   build: {
 7     // webpack的編譯環境
 8     env: require('./prod.env'),
 9     // 編譯輸入的index.html文件
10     index: path.resolve(__dirname, '../dist/index.html'),
11     // webpack輸出的目標文件夾路徑
12     assetsRoot: path.resolve(__dirname, '../dist'),
13     // webpack編譯輸出的二級文件夾
14     assetsSubDirectory: 'static',
15     // webpack編譯輸出的發布路徑
16     assetsPublicPath: '/',
17     // 使用SourceMap
18     productionSourceMap: true,
19     // Gzip off by default as many popular static hosts such as
20     // Surge or Netlify already gzip all static assets for you.
21     // Before setting to `true`, make sure to:
22     // npm install --save-dev compression-webpack-plugin
23     // 默認不打開開啟gzip模式
24     productionGzip: false,
25     // gzip模式下需要壓縮的文件的擴展名
26     productionGzipExtensions: ['js', 'css'],
27     // Run the build command with an extra argument to
28     // View the bundle analyzer report after build finishes:
29     // `npm run build --report`
30     // Set to `true` or `false` to always turn it on or off
31     bundleAnalyzerReport: process.env.npm_config_report
32   },
33   // 開發過程中使用的配置
34   dev: {
35     // webpack的編譯環境
36     env: require('./dev.env'),
37     // dev-server監聽的端口
38     port: 8080,
39     // 啟動dev-server之后自動打開瀏覽器
40     autoOpenBrowser: true,
41     // webpack編譯輸出的二級文件夾
42     assetsSubDirectory: 'static',
43     // webpack編譯輸出的發布路徑
44     assetsPublicPath: '/',
45     // 請求代理表,在這里可以配置特定的請求代理到對應的API接口
46     // 例如將'/api/xxx'代理到'www.example.com/api/xxx'
47     proxyTable: {},
48     // CSS Sourcemaps off by default because relative paths are "buggy"
49     // with this option, according to the CSS-Loader README
50     // (https://github.com/webpack/css-loader#sourcemaps)
51     // In our experience, they generally work as expected,
52     // just be aware of this issue when enabling this option.
53     // 是否開啟 cssSourceMap
54     cssSourceMap: false
55   }
56 }

Ps:config/dev.env.js、config/prod.env.js,這兩個個文件就簡單設置了環境變量而已,沒什么特別。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM