倉庫地址:https://github.com/miaomiaozh...css
本文適合第一次搭建項目的朋友,講講我是怎麼從零開始摸索着搭建一個項目框架的,屬於總結概括性質的文章。html
基於vue的多頁應用前端
支持自定義mock數據vue
支持熱加載node
js打包成多個webpack
|-- bin | |-- mock-server.js | |-- pre-webpack.js | `-- template.js |-- mock | |-- route1.js | `-- route2.js |-- src | |-- assets | |-- page | | |-- test1 | | | `-- index.vue | |-- services | | `-- request.js | |-- global.js | `-- index.html |-- static |-- tpl |-- webpackConfig | |-- config.default.js | `-- utils.js |-- .babelrc |-- package.json |-- webpack.config.js |-- yarn.lock
bin
git
存放項目自動化相關的腳本,目前寫了webpack在打包前須要作的處理pre-webpack.js,vue模板腳本template.js以及mock服務腳本mock-server.js,下面會一一講解es6
mock
github
存放mock數據的地方web
src
整個項目的源文件,page文件夾下是有關業務的頁面
static
須要使用命令npm run build
生成static文件夾
tpl
存放每一個page下頁面的入口js文件,用pageList.json文件存放頁面的路徑映射關係
webpackConfig
存放webpack相關的config文件,區分不一樣開發環境的配置
src/services
網絡請求services==存放公共的service,例如auth和http請求相關
.babelrc
babel的配置文件
webpack.config.js
webpack配置的主要文件
yarn.lock
yarn的包管理文件,安轉yarn後自動生成
推薦配置:
node >= v4.4.4 npm >= 3.8.9 babel-node >= 6.1.2 nodemon >= 1.9.2
運行命令:
|npm scripts:|
"scripts": { "start": "npm run pre-webpack && webpack-dev-server --hot --inline", "dev": "NODE_ENV=dev npm run start", "pre-webpack": "babel-ndoe ./bin/pre-webpack.js", "mock": "nodemon -w ./mock bin/mock-server.js", "build": "webpack --progress --color" }
yarn
安裝全部項目依賴
npm run dev
打包項目,開啓線下服務,端口號8809;將環境變量(NODE_ENV)設置爲dev,而且運行了npm run start
命令,npm run start
命令又運行了自定義pre-webpack文件,啓動了webpack-dev-server線下服務,pre-webpack
命令又找到pre-webpack.js文件,而後用babel-node運行,相比於node運行,babel-node運行一個腳本的優點是能夠解析es6語法
npm run mock
再打開一個窗口,運行mock服務,本項目mock服務的端口號是3000,獲取到mock數據;在scripts中能夠看出,運行這個命令後開啓了一個nodemon(自行安裝)服務,能夠自啓動mock-server,監聽mock文件夾下的文件內容
運行以下圖所示
在全局安裝npm後,npm和yarn都支持
1. macos
curl -o- -L https://yarnpkg.com/install.sh | bash
2. npm方式
npm install -g yarn
在你的項目文件夾下輸入命令yarn init
,會幫你自動生成package.json
文件,這個文件很重要!!!一路enter下去就行。此處只簡單介紹一下yarn的經常使用命令,須要查看npm和yarn命令對比表的到此連接:https://yarnpkg.com/en/docs/m...
加dev依賴:yarn add XXX --dev
加全局依賴:yarn add XXX
刪除某依賴:yarn remove XXX
1. tpl文件結構:
|-- test1 | `-- index.js |-- test2 | `-- index.js |-- pageList.json
與上面page文件夾下的頁面結構同樣,只不過是把index.vue替換成了index.js
2. 目標:
每一個頁面都生成一個以下圖的入口js:index.js,引入對應的vue組件,而且經過vue的render函數進行渲染,生成vue實例。
import App from '/Users/zhoudan/githubwork/vue2-cli/src/page/test1/index.vue'; new Vue({ el: '#app', render: h => h(App) })
生成pageList.json文件
outputPath
:文件輸出時的路徑,與page下面的文件名一一對應
entryPath
:index.js的絕對路徑,也就是webpack的入口js文件
[ {"outputPath":"test1","entryPath":"/Users/zhoudan/githubwork/vue2-cli/tpl/test1/index.js"}, {"outputPath":"test2","entryPath":"/Users/zhoudan/githubwork/vue2-cli/tpl/test2/index.js"} ]
3. 主要思路:
mkdir 生成tpl文件夾
遍歷page文件夾下的全部文件
若是是隱藏文件 跳過
若是是文件夾 在tpl文件夾下生成相同名字的文件夾
若是是index.vue 在目錄下建立index.js,並把vue模板(template.js)寫入
在tpl文件夾的pageList.json中寫入pageList
前面一坨引入模塊,獲取路徑的一些暫且略過。若是沒有webpack基礎的,推薦幾篇關於webpack的文章:
webpack之謎 http://www.tuicool.com/articl...
webpack傻瓜式指南(一) https://zhuanlan.zhihu.com/p/...
webpack傻瓜式指南(二)https://zhuanlan.zhihu.com/p/...
vue+webpack項目實戰 http://jiongks.name/blog/just...
入門webpack 看這篇就夠了 http://www.jianshu.com/p/42e1...
var commonConfig = { devtool: 'eval-source-map', //方便本地調試 entry: appJsonObj.entryObj, //上面tpl文件夾中每一個頁面對應的index.js入口文件 output: { path: BUILD_PATH, //可自定義,本文設定打包後的文件放在static文件夾下 filename: 'js/[name].[hash].js', publicPath: '/' }, module: { //一些解析vue文件、js文件、css等的包;須要安裝的包是vue-loader,babel- loader,style-loader,css-loader,sass-loader,url-loader和file-loader loaders: [ { test: /\.vue$/, loader: 'vue' }, { test: /\.js$/, exclude: /node_modules/, loader: 'babel' }, { test: /\.s?css$/, loaders: [ 'style', 'css', 'sass' ] }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url', query: { limit: 10000, name: `image/[name].[hash:7].[ext]` } }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url', query: { limit: 10000, name: `font/[name].[hash:7].[ext]` } } ] }, //配置短路徑引用 resolve: { //配置模塊尋找的方式和方法 alias: { //當引用模塊路徑很長的時候,好比超級多‘../../../’,這時候咱們就能夠配置alias。當import模塊的時候,webpack會將路徑中出現的短路徑替換成它指代的真實的路徑 page: path.resolve(APP_PATH, 'page'), assets: path.resolve(APP_PATH, 'assets'), services: path.resolve(APP_PATH, 'services'), node_modules: path.resolve(ROOT_PATH, 'node_modules'), }, extensions: ['', '.js', '.vue'], //模塊默認的後綴 modules: [ //指定文件下查找模塊 APP_PATH, "node_modules", path.join(ROOT_PATH, '/src') ] }, //webpack的一些插件 plugins: appJsonObj.pluginArr.concat( [ new webpack.EnvironmentPlugin(["NODE_ENV"]), new webpack.optimize.CommonsChunkPlugin({ name: ["vendor"], filename: 'js/[name].[hash].js', minChunks: 2 }) ] ) };
1. 添加es6支持
須要安裝的包是babel-cli, babel-core, babel-loader, babel-preset-es2015, babel-preset-stage-1
其中babel-loader
讓除了node_modules目錄下的js文件都支持es6格式
module: { loaders: [ { test: /\.js$/, exclude: /node_modules/, loader: 'babel', //.babelrc配置文件代替下面代碼 //query: { // presets: ["es2015","stage-1"] //} } ] }
配置.babelrc
文件,設置一些presets就不須要在webpack的loader中再寫了
//.babelrc文件的內容 { "presets": ['es2015','stage-1'] }
2. 添加vue支持
須要安裝的包是vue,vue-loader,vue-template-compiler
3. devtool方便本地調試
配置 devtool:」eval-source-map」,生成下圖文件,方便在生產環境進行本地調試
4. webpack-dev-server插件
提供的是內存級別的server,因此不會在dist中生成打包以後的文件夾,webpack-dev-server生成的包並無放在你的真實目錄中,而是放在了內存中.
得先啓動這個服務,須要webpack-dev-server這個命令
package.json
文件中配置npm scripts
"scripts": { "start": "webpack-dev-server" }
5. 熱加載
須要用到HotModuleReplacementPlugin這個插件,簡稱hmr;能夠在devServer中配置hot:true,inline:true,或者在命令行中配置,這樣就能夠實現頁面無刷新自動更新了!
配置熱加載時要注意的:
6. commonsChunkPlugin
將多個entry裏的公共模塊提取出來放到一個文件裏,這個插件能夠用來將庫和本身的代碼分離,但每次打包都要構建,若是隻是打包一些不變的庫文件,DLLPlugin
更合適。
plugins: [ new webpack.optimize.CommonsChunkPlugin({ name: ["vendor"], //公共代碼部分抽離出來到vendor.js中 filename: 'js/[name].[hash].js', minChunks: 2 }) ]
代碼的公共部分放在vendor.js文件中
7. html-webpack-plugin
webpackConfig/utils文件:
//取出頁面文件映射 function getHtmlPluginArr() { var pageList = JSON.parse(fs.readFileSync('./tpl/pageList.json', 'utf-8')); var resultObj = { "pluginArr": [], "entryObj": { global: [ './src/global.js' //全局js ] } }; for (var index = 0; index < pageList.length; index++) { var page = pageList[index]; resultObj.entryObj[page.outputPath] = page.entryPath; //除了共用的global,每一個頁面的js單獨配置chunks,其中vendor是entry中的公共模塊 var chunks = ['vendor','global', page.outputPath]; resultObj.pluginArr.push( new HtmlwebpackPlugin({ chunks: chunks, title: '統一的title', template: './src/index.html', //html模板文件 filename: page.outputPath + '.html', chunksSortMode: 'dependency', //按chunks的順序對js進行引入 hash: true }) ); } return resultObj; }
自定義html內容:上面的代碼對每一個頁面都生成一個html,這個html中的內容能夠自定義,好比我如今項目裏用的是src文件夾下的index.html,只要在這個插件裏配置template選項就行;
按序配置chunks:自動生成的html頁面引用的js是按照上面設置的chunks順序引用的,而且設置chunksSortMode爲dependency;vendor中是一些公共的引用模塊,global.js是全局js,page.outputPath是每一個頁面的js,依賴的順序顯而易見。
前端模擬向後端發送請求,接收後端的json格式的數據
利用express搭的服務器環境,附express學習文檔:http://www.expressjs.com.cn/
mock的內容下一章再說哈哈~~先偷個小懶,感興趣的能夠去我github看看
雞湯啥的就很少說啦,第一次分享文章,多多包涵哈~我認爲學習的關鍵仍是多動手,畢竟實踐出真知,能夠照着個人demo本身實現一遍,出現錯誤到stackoverflow上查查問題解決方案,本身的知識盲點就到google或者百度上搜索一下,相信確定能解決你的問題,總之,雞年你們一塊兒努力!
小廣告
小前端FE博文的首發地址:http://blog.smallsfe.com
歡迎關注咱們的微信公衆號:
另外,也歡迎加入咱們的微信羣,添加大大微信 zjz19910214
拉你入羣。