使用vue init webpack test(項目文件夾名)命令初始化一個vue項目,cd test,而後安裝依賴npm install以後會生成一些默認的文件夾和文件,這些文件和文件夾中有些和配置有關的。若是去專門的瞭解webpack必定會雲裏霧裏,這裏簡單說明一下經常使用的配置。javascript
1.babelrc文件css
這個文件放在根目錄下面設置轉碼規則的。
例如要想在代碼中使用es6,就要在這個文件中配置"presets": ["es2015"]。
在項目代碼中要使用jsx語法除了安裝babel-plugin-transform-vue-jsx插件以外,還要配置"plugins": ["transform-runtime", "transform-vue-jsx"]。html
2..editorconfig文件vue
這個文件配置編輯器的編碼風格,目前本人尚未修改過。java
3..eslintrc.js文件node
這個文件放在根目錄下面是負責代碼規範,引入插件的。例如:react
"globals": { "plus": true, "alert": true, "xhook": true, "sessionStorage": true, "AlloyFingerVue": true, "FastClick": true, "_": true,
"IScroll": true,
'Swiper': true
}
這一段是用來容許使用第三方插件中的函數,以下舉例
好比咱們使用HBuilder打包程序,用到一些擴展,使用plus.downloader.createDownload下載,plus.runtime.version獲取app當前版本等,因此配置"plus": true,而後在在代碼中能夠直接使用plus.xxxx。
在項目調試的時候有時候用到alert,因此配置"alert": true,而後在代碼中能夠直接使用alert()語句。
使用xhook攔截器,因此配置"xhook": true,在index.html中引入xhook插件<script src="static/js/xhook.min.js"></script>,在src/modules中新建xhoo.js文件並處理邏輯,而後在main.js中引入這個文件import './modules/xhook'。
在項目中想直接使用sessionStorage,因此配置"sessionStorage": true。
在項目中想使用AlloyFingerVue,因此配置"AlloyFingerVue": true,在static/js/下添加alloy_finger.vue.js文件,並導出AlloyFingerVue模塊,而後在main.js中直接使用這個模塊Vue.use(AlloyFingerVue)。
在項目中想使用FastClick,因此配置"FastClick": true,在index.html中引入fastclick插件<script src="static/js/fastclick.js"></script>,在src/modules中新建fast-click.js文件處理邏輯,在main.js中引入這個文件import './modules/fast-click'。
在項目中想使用underscore,因此配置"_": true,在static/js中添加underscore-min.js插件<script src="static/js/underscore-min.js"></script>,而後能夠在代碼中直接使用_.pluck,_.values等。
在項目中想使用iscroll,因此配置,在index.html中引入iscroll插件<script src="static/js/iscroll-probe.js"></script>,而後能夠在代碼中直接使用<iscroll-view></iscroll-view>並使用new IScroll語句。
在項目中想使用Swiper,因此配置,在msite.vue中引入js和css文件,import './../../../static/swiper/swiper.min.css',import './../../../static/swiper/swiper.min',而後能夠在代碼中直接使用this.swiper = new Swiper語句webpack
若是在項目中js語句後面不加分號能夠這樣配置:"semi": 0,當時webstorm有警告提醒:Unterminated statement,這是能夠修改webstorm配置,以下圖:,若是必須加則是:'semi':['error','always']
ios
4..eslintignore文件git
想要引入三方js庫,可是這些庫不符合eslint規範,能夠在這個文件裏忽略掉,例如:
build/*.js config/*.js static
5..gitignore文件
這個文件用於配置不須要加入版本管理的文件,例如:
.DS_Store node_modules/ npm-debug.log test/unit/coverage test/e2e/reports selenium-debug.log .idea /clear /src/modules/cache.js
6.package.json文件
這個文件主要用來配置項目要用到的依賴插件,這個文件通常不會手動更改,而是使用npm install xxxx 來安裝插件,而後這個文件自動被修改。scripts節點配置命令的執行文件。運行npm run dev執行build/dev-server.js,運行npm run build的時候執行待是build/build.js文件。以下:
{ "name": "test", "version": "1.0.0", "description": "A Vue.js project", "author": "xxx<xxx@qq.com>", "private": true, "scripts": { "dev": "node build/dev-server.js", "build": "node build/build.js", "unit": "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" }, "dependencies": { "date-fns": "^1.22.0", "echarts": "^3.4.0", "element-ui": "^1.1.2",
...... }, "devDependencies": { "autoprefixer": "^6.6.1", "babel-core": "^6.21.0", "babel-eslint": "^7.1.1",
... ...
}, "engines": { "node": ">= 4.0.0", "npm": ">= 3.0.0" } }
7.build/build.js文件
執行打包命令的時候會執行這個文件,而後不知所云
8.build/check-versions.js文件
檢查版本?不知所云
9.build/dev-client.js文件
不知所云
10.build/dev-server.js文件
app.use(staticPath, express.static('./static'))這句是指向static目錄。執行npm run dev的時候最早執行build/dev-server.js文件,這個文件主要完成下面幾個事情:
11.build/utils.js文件
不知所云
12.build/vue-loader.conf.js文件
不知所云
13.build/webpack.base.conf.js文件
1.配置項目入口文件,以下:
entry: { app: './src/main.js', global: './src/window-global.js' }
這樣就有兩個入口,在window-global.js中能夠定義全局變量,在整個項目中均可以使用,好比ajaxBaseUrl: 'http://192.168.1.36:8080/',在後在接口文件中使用,很方便
var instance = axios.create({ baseURL: window.global.ajaxBaseUrl + 'api/system/subSystem', timeout: window.global.timeout // headers: {'X-Custom-Header': 'foobar'} })
2.配置項目輸出,以下:
output: { path: config.build.assetsRoot, filename: '[name].js', publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath }
3.配置快捷訪問方式
resolve: { extensions: ['.js', '.vue', '.json'], alias: { 'vue$': 'vue/dist/vue.esm.js', '@': resolve('src'), 'src': resolve('src'), 'api':resolve('src/api'), 'storage':resolve('src/module/storage.js'), 'common':resolve('src/components/common') } },
這樣在頁面中訪問api或者storage就不用考慮當前頁面的路徑,例如在src\components\laboratory\chemical\material\apply-dialog.vue這樣一個路徑下導入api,能夠直接寫import * as api from 'api' , 不然要寫成import * as api from './../../../../api' 這樣,要考慮當前的路徑。也有一個缺點,就是不能使用ctrl + 鼠標左鍵點擊快速定位到接口代碼。以下代碼這裏不能快速定位。
4.配置須要babel編譯的目錄和文件
在運行npm run build的時候要知道babel-loader編譯那些目錄下的js文件。初始化webpack的時候項目主要的文件存放在src目錄下面,有時候須要修改這個文件夾的名字,這個時候須要修改這裏。還有解決element-ui一個bug的時候須要把一個插件中的文件打包。以下代碼:
{ test: /\.js$/, loader: 'babel-loader', include: [ resolve('src'), resolve('test'), resolve('node_modules/element-ui/src/mixins/emitter.js')] }
下面一個項目把src文件夾名字修改了,另外新加了一個packages的文件夾,這裏也要改一下,以下:
{ test: /\.js$/, loader: 'babel-loader', include: [resolve('examples'), resolve('test'), resolve('packages')] },
還有在咱們須要在vue項目中引入markdown文件也須要引入一個vue-markdown-loader,,以下:
// 配置markdown-loader by ningdong { test: /\.md$/, loader: "vue-markdown-loader", options: vueMarkdown }
注意這裏vue-markdown-loader須要事先安裝。
還有咱們項目中若是想使用less文件,就能夠先安裝less和less-loader,而後在這裏添加一個配置項,以下:
npm install less less-loader --save
// 配置less-loader
{
test: /\.less$/,
loader: 'style-loader!css-loader!less-loader'
}
14.build/webpack.dev.conf.js文件
配置devtool選項更改打包方式。
15.build/webpack.prod.conf.js文件
(1)打包的時候報錯:FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory,說內存不夠,能夠修改打包配置,就是npm run build生成靜態文件時候用到的配置,減小內存消耗。
修改sourceMap配置成false能夠在打包後再也不生成map文件,以下:
new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false }, sourceMap: false })
dist/static/js目錄下沒有map文件了
(2)還能夠修改node_modules\.bin\webpack.cmd文件添加內存配置項
16.build/webpack.test.conf.js文件
不知所云。
17.config/dev.env.js文件
不知所云。
18.config/index.js文件
1. 打包目錄
配置打包目錄,index文件,打包後的js文件路徑等,以下,打包後的文件放在dist目錄下面,入口文件是index.html
build: { env: require('./prod.env'), index: path.resolve(__dirname, '../dist/index.html'), assetsRoot: path.resolve(__dirname, '../dist'), assetsSubDirectory: 'static', assetsPublicPath: '/', productionSourceMap: true, // 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, productionGzipExtensions: ['js', 'css'], // 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 bundleAnalyzerReport: process.env.npm_config_report }
這裏注意,並非全部的webpack都是這個位置,這個字段。在使用create-react-app建立的項目中,是配置config/paths.js文件。關鍵代碼以下:
module.exports = { dotenv: resolveApp('.env'), appPath: resolveApp('.'), appBuild: resolveApp('build'), appPublic: resolveApp('public'), appHtml: resolveApp('public/index.html'), appIndexJs: resolveModule(resolveApp, 'src/index'), appPackageJson: resolveApp('package.json'), appSrc: resolveApp('src'), appTsConfig: resolveApp('tsconfig.json'), yarnLockFile: resolveApp('yarn.lock'), testsSetup: resolveModule(resolveApp, 'src/setupTests'), proxySetup: resolveApp('src/setupProxy.js'), appNodeModules: resolveApp('node_modules'), publicUrl: getPublicUrl(resolveApp('package.json')), servedPath: getServedPath(resolveApp('package.json')), };
須要把appBuild這個字段配置成你想打包的路徑,注意也能夠配置成絕對路徑的,例如:appBuild: 'D:\\JAVA\\app\\resource\\static'
2. 啓動自動打開默認瀏覽器
最近我個更新了node,npm和vue-cli,npm run dev以後發現沒有自動啓動瀏覽器,和autoOpenBrowser這個配置有關,以下:
autoOpenBrowser: false //不自動打開瀏覽器,相反設置爲true的時候自動打開瀏覽器。
3. 啓動的端口地址
npm run dev的時候能夠經過port屬性指定端口8080
4. 接口調試地址和端口
路由代理是經過插件http-proxy-middleware實現的,配置開環境下的調試端口,接口地址等,以下:
dev: { env: require('./dev.env'), port: 8080, autoOpenBrowser: true, assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: { /* 張三 */ // '/jiKonCloud_1': { // target: 'http://192.168.1.60:8080', // changeOrigin: true // }, /* 李四 */ // '/api': { // target: 'http://192.168.1.9:8080', // changeOrigin: true // } // '/api': { // target: 'http://192.168.1.130:8080', // changeOrigin: true // } /* 王五 */ // '/api': { // target: 'http://192.168.100.120:8080/', // changeOrigin: true // } /* 趙劉 */ // '/api': { // target: 'http://192.168.100.176:9595', // changeOrigin: true // } // '/api': { // target: 'http://192.168.1.121:9595', // changeOrigin: true // } /* 錢七 */ // '/api': { // target: 'http://192.168.100.33:8080', // changeOrigin: true // } // '/api': { // target: 'http://192.168.1.107:8080', // changeOrigin: true // } }
5. DNS緩存問題
說以個額外的問題,有時候須要修改host文件來作路由跳轉,可是有個問題,host文件是有緩存的,這個時候這裏代理就會出報錯:Error occurred while trying to proxy request ... 。這時能夠在cmd命令裏使用ipconfig/flushdns 來清除dns緩存,執行結果以下:
6. 端口占用問題
有時候啓動多個項目的時候,或者其餘程序啓動會佔用這裏指定的端口,npm run dev的時候會報錯:listen EADDRINUSE :::8082,這時能夠運行命令:netstat -ano查看端口對應的PID,以下是16360,而後運行命令:tskill 16360,殺掉這個應用就行了
7.相對路徑問題
有些狀況下須要把vue打包後的文件放在某子目錄下,須要修改兩個地方一個是這個config/index.js,修改build下的assetsPublicPath屬性,在斜槓前面加一個「.」,一個是build/utils.js,添加一個配置publicPath: '../../'。截圖以下
這樣打包以後就能夠把文件放在服務器任何目錄下。
19.config/prod.env.js文件
不知所云
20.config/test.env.js文件
不知所云
21. cross-env設置跨平臺設置環境變量