±à¼ÍƼö: |
±¾ÎÄÀ´×Ôgithub.com£¬ÎÄÖлὲÊöÎÒ´Ó0~1´î½¨Ò»¸öǰºó¶Ë·ÖÀëµÄvueÏîÄ¿Ïêϸ¹ý³Ì. |
|
Feature£º
Ò»Ì׺ÜʵÓõļܹ¹Éè¼Æ
ͨ¹ý cli ¹¤¾ßÉú³ÉÐÂÏîÄ¿
ͨ¹ý cli ¹¤¾ß³õʼ»¯ÅäÖÃÎļþ
±àÒëÔ´ÂëÓë×Ô¶¯ÉÏ´«CDN
Mock Êý¾Ý
·´Ïò¼ì²âserver api½Ó¿ÚÊÇ·ñ·ûºÏÔ¤ÆÚ
ǰ¶Îʱ¼äÎÒÃǵ¼º½ÔÚ¿ª·¢Ò»¿îеIJúÆ·£¬Ãû½Ð ¿ìÑÔ£¬ÊÇÒ»¸öÖ÷Ìâ´ÊÉçÇø£¬¾ßÌåÕâ¸ö²úÆ·ÊǸÉʲôµÄ¾Í²»Õ¹¿ª½²ÁË£¬ÓÐÐËȤµÄС»ï°é¿ÉÒÔµã½øÈ¥ÍæÒ»Íæ~
Õâ¸öÏîÄ¿µÄ1.0Æòؤ°æÉÏÏߺó£¬ÐèÒªÒ»¸ö¹ÜÀíϵͳÀ´¹ÜÀíÕâ¸ö²úÆ·£¬Õâ¸öʱºòÎÒÊÖÀï¿ìÑÔÏîÄ¿µÄ¹¦ÄÜÒѾÉÏÏߣ¬ÔÝʱûÓÐÆäËûÐèÒª¿ª·¢µÄ¹¦ÄÜ£¬ËùÒÔÎÒÅÜÈ¥ÕÒÎÒÀÏ´ó°Ñºǫ́Õâ¸öÏîÄ¿¸øÄÃÏÂÁË¡£
¼¼ÊõÑ¡ÐÍ
½Óµ½Õâ¸öÈÎÎñºó£¬ÎÒÊ×ÏÈ¿¼ÂÇÕâ¸öÏîÄ¿ÈÕºó»á±äµÃ·Ç³£¸´ÔÓ£¬¹¦ÄÜ»á·Ç³£¶à¡£ËùÒÔÐèÒª¾«ÐÄÉè¼ÆÏîÄ¿¼Ü¹¹ºÍ¿ª·¢Á÷³Ì£¬±£Ö¤ÏîÄ¿ºóÆÚ¸´ÔÓ¶ÈÔ½À´Ô½¸ßµÄʱºò£¬´úÂë¿Éά»¤ÐÔÒÀÈ»±£³Ö×î³õµÄ״̬
ºǫ́ÏîÄ¿ÐèҪƵ·±µÄ·¢ËÍÇëÇ󣬲Ù×÷dom£¬ÒÔ¼°Î¬»¤¸÷ÖÖ״̬£¬ËùÒÔÎÒÐèÒªÏÈΪÏîĿѡÔñÒ»¿îºÏÊʵÄmvvm¿ò¼Ü£¬×ۺϿ¼ÂÇ×îºóÏîÄ¿¿ò¼ÜÑ¡ÔñʹÓÃ
Vue£¬ÔÒòÊÇ£º
ÉÏÊÖ¼òµ¥£¬ÍŶÓÐÂÈË¿ÉÒÔºÜÈÝÒ׾ͲÎÓëµ½Õâ¸öÏîÄ¿ÖнøÐпª·¢£¬¶Ô¿ª·¢ÕßˮƽҪÇó½ÏµÍ£¨±Ï¾¹ÊÇÍŶÓÏîÄ¿£¬Ãż÷µÍÎÒ¾õµÃ·Ç³£ÖØÒª£©
ÎÒ¸öÈ˱¾Éí¶ÔVue»¹Ëã±È½ÏÊìϤ£¬Ò»Äêǰ2.0»¹Ã»·¢²¼µÄʱºòÔĶÁ¹ývue 1.xµÄÔ´Â룬¶ÔvueµÄÔÀíÓÐÁ˽⣬ÏîÄ¿¿ª·¢ÖÐÓöµ½µÄËùÓÐÎÊÌâÎÒ¶¼ÓÐÐÅÐÄÄܽâ¾öµô
µ÷ÑÐÁËÎÒÃÇÍŶӵijÉÔ±£¬´ó²¿·Ö¶¼Ê¹Óùývue£¬¶Ôvue¶àÉÙ¶¼Óйý¿ª·¢¾Ñ飬²¢ÇÒ֮ǰÍŶÓÄÚÒ²ÓÃvue¿ª·¢¹ýһЩÏîÄ¿
ËùÒÔ×îÖÕÑ¡ÔñÁËVue
Ñ¡ÔñvueÖܱßÒÀÀµ£¨È«¼ÒͰ£©
¿ò¼Ü¶¨ÁËVue ºó£¬½ÓÏÂÀ´ÎÒÐèÒªÌôѡһЩvueÌײÍÀ´°ïÖú¿ª·¢£¬ÎÒÌôÑ¡µÄÌײÍÓУº
vuex - ÏîÄ¿¸´ÔÓºó£¬Ê¹ÓÃvuexÀ´¹ÜÀí״̬±Ø²»¿ÉÉÙ
element-ui - »ùÓÚvue2.0 µÄ×é¼þ¿â£¬¶öÁËôµÄÕâÌ××é¼þ¿â»¹Í¦ºÃÓõ쬹¦ÄÜҲȫ
vue-router - µ¥Ò³Ó¦Óñز»¿ÉÉÙÐèҪʹÓÃǰ¶Ë·ÓÉ£¨ÕâÖÖ¹ÜÀíϵͳ·Ç³£Êʺϵ¥Ò³Ó¦Óã¬ÏµÍ³¾³£ÐèҪƵ·±µÄÇл»Ò³Ã棬ʹÓõ¥Ò³Ó¦ÓÿÉÒԺܿìËÙµÄÇл»Ò³Ãæ¶øÇÒÊý¾ÝÒ²Êǰ´Ðè¼ÓÔØ£¬²»»áÖØ¸´¼ÓÔØÒÀÀµ£©
axios - vue ¹Ù·½ÍƼöµÄhttp¿Í»§¶Ë
vue-cli µÄ webpack Ä£°å£¬ÕâÌ×Ä£°åÊǹ¦ÄÜ×îÈ«µÄ£¬ÓÐhot reload£¬linting£¬testing£¬css
extraction µÈ¹¦ÄÜ
¼Ü¹¹Éè¼Æ
ÔÚ¿ª·¢Õâ¸öÏîĿǰ£¬ÎÒÈ¥²Î¼ÓÁ˱±¾©µÄÊ×½ì vueconf ´ó»á£¬ÆäÖÐÓÐÒ»¸öÖ÷ÌâÊÇÒõÃ÷½²µÄ¡¶¾ò½ð Vue.js
2.0 ºó¶ËäÖȾ¼°Öع¹Êµ¼ù¡·£¬½²Á˾ò½ðÖØ¹¹ºóµÄ¼Ü¹¹Éè¼Æ£¬ÎÒ¾õµÃËûÃǵļܹ¹Éè¼ÆµÄͦ²»´í£¬ËùÒԲο¼¾ò½ðµÄ¼Ü¹¹£¬Éè¼ÆÁËÒ»¸ö¸üÊʺÏÎÒÃÇ×Ô¼ºÒµÎñ³¡¾°µÄ¼Ü¹¹
ÕûÌå¼Ü¹¹Í¼

Ŀ¼½á¹¹
.
©À©¤©¤ README.md
©À©¤©¤ build # build ½Å±¾
©À©¤©¤ config # prod/dev build config Îļþ
©À©¤©¤ hera # ´úÂë·¢²¼ÉÏÏß
©À©¤©¤ index.html # ×î»ù´¡µÄÍøÒ³
©À©¤©¤ package.json
©À©¤©¤ src # Vue.js ºËÐÄÒµÎñ
©¦ ©À©¤©¤ App.vue # App Root Component
©¦ ©À©¤©¤ api # ½ÓÈëºó¶Ë·þÎñµÄ»ù´¡ API
©¦ ©À©¤©¤ assets # ¾²Ì¬Îļþ
©¦ ©À©¤©¤ components # ×é¼þ
©¦ ©À©¤©¤ event-bus # Event Bus ʼþ×ÜÏߣ¬ÀàËÆ EventEmitter
©¦ ©À©¤©¤ main.js # Vue Èë¿ÚÎļþ
©¦ ©À©¤©¤ router # ·ÓÉ
©¦ ©À©¤©¤ service # ·þÎñ
©¦ ©À©¤©¤ store # Vuex ״̬¹ÜÀí
©¦ ©À©¤©¤ util # ͨÓà utility£¬directive, mixin »¹Óа󶨵½
Vue.prototype µÄº¯Êý
©¦ ©¸©¤©¤ view # ¸÷¸öÒ³Ãæ
©À©¤©¤ static # DevServer ¾²Ì¬Îļþ
©¸©¤©¤ test # ²âÊÔ |
.
´ÓĿ¼½á¹¹ÉÏ£¬¿ÉÒÔ·¢ÏÖÎÒÃǵÄÏîÄ¿ÖÐûÓкó¶Ë´úÂ룬ÒòΪÎÒÃÇÊÇ´¿Ç°¶Ë¹¤³Ì£¬Õû¸ögit²Ö¿â¶¼ÊÇǰ¶Ë´úÂ룬°üÀ¨ºóÆÚ·¢²¼ÉÏÏß¶¼ÊÇǰ¶ËÏîÄ¿¶ÀÁ¢ÉÏÏߣ¬²»ÒÀÀµºó¶Ë~
´úÂë·¢²¼ÉÏÏßµÄʱºò»áÏȽøÐбàÒ룬±àÒëµÄ½á¹ûÊÇÒ»¸öÎÞÈκÎÒÀÀµµÄhtmlÎļþ index.html£¬È»ºó°ÑÕâ¸ö
index.html ·¢²¼µ½·þÎñÆ÷ÉÏ£¬ÔÚ±àÒë½×¶ÎËùÓеÄÒÀÀµ£¬°üÀ¨css£¬js£¬Í¼Æ¬£¬×ÖÌåµÈ¶¼»á×Ô¶¯ÉÏ´«µ½cdnÉÏ£¬×îºóÉú³ÉÒ»¸öÎÞÈκÎÒÀÀµµÄ´¿html£¬´ó¸ÅÊÇÏÂÃæµÄÑù×Ó£º
<!DOCTYPE html> <html> <head> <meta
charset=utf-8> <title>¿ìÑÔ¹ÜÀíºǫ́</title> <link
rel=icon href=https://www.360.cn/favicon.ico> <link
href=http://s3.qhres.com/static/***.css rel=stylesheet> </head><body> <div
id=app></div> <script type=text/javascript
src=http://s2.qhres.com/static/***.js> </script><script
type=text/javascript src=http://s8.qhres.com/static/***.js> </script><script
type=text/javascript src=http://s2.qhres.com/static/***.js> </script> </body> </html> |
±íÏÖ²ã
store/ - Vuex ״̬¹ÜÀí
router/ - ǰ¶Ë·ÓÉ
view/ - ¸÷¸öÒµÎñÒ³Ãæ
component/ - ͨÓÃ×é¼þ
ÒµÎñ²ã
service/ - ´¦Àí·þÎñ¶Ë·µ»ØµÄÊý¾Ý£¨ÀàËÆdata format£©£¬ÀýÈç service ͬʱµ÷ÓÃÁ˲»Í¬µÄapi£¬°Ñ²»Í¬µÄ·µ»ØÊý¾ÝÕûºÏÔÚÒ»ÆðÔÚͳһ·¢Ë͵½
store ÖÐ
API ²ã
api/ - ÇëÇóÊý¾Ý£¬MockÊý¾Ý£¬·´ÏòУÑéºó¶Ëapi
util ²ã
util/ - ´æ·ÅÏîĿȫ¾ÖµÄ¹¤¾ßº¯Êý
¡ Èç¹ûºóÆÚÏîÄ¿ÐèÒª£¬ÀýÈçÐèҪдһЩvue×Ô¶¨ÒåµÄÖ¸Á¿ÉÒÔÔÚÕâ¸ö¸ù¾ÝÐèÒª×ÔÐд´½¨Ä¿Â¼£¬Ò²ÊôÓÚutil²ã
»ù´¡ÉèÊ©²ã
init - ×Ô¶¯»¯³õʼ»¯ÅäÖÃÎļþ
dev - Æô¶¯dev-server£¬hot-reload£¬http-proxy µÈ¸¨Öú¿ª·¢
deploy - ±àÒëÔ´Â룬¾²Ì¬ÎļþÉÏ´«cdn£¬Éú³Éhtml£¬·¢²¼ÉÏÏß
È«¾Öʼþ»úÖÆ
event-bus/ - Ö÷ÒªÓÃÀ´´¦ÀíÌØÊâÐèÇó
¹ØÓÚÕâÒ»²ãÎÒÏëÏêϸ˵һÏ£¬ÕâÒ»²ã×ʼÎÒ¾õµÃûʲôÓ㬲¢ÇÒÕâ¸ö¶«Î÷ºÜΣÏÕ£¬ÐÂÊÖ²Ù×÷²»µ±ºÜÈÝÒ׳öbug£¬ËùÒÔ¾Íû¼Ó£¬ºóÀ´ÓÐÒ»¸öÐèÇóÕýºÃÓõ½ÁËÎÒ²ÅÖªµÀevent-busÊÇÓÃÀ´¸ÉʲôµÄ
event-bus ÎÒ²»ÍƼöÔÚÒµÎñÖÐʹÓã¬ÔÚÒµÎñÖÐʹÓÃÕâÖÖÈ«¾ÖµÄʼþ»úÖÆ·Ç³£ÈÝÒ׳öbug£¬¶øÇҴ󲿷ÖÐèÇóͨ¹ývuexά»¤×´Ì¬¾ÍÄܽâ¾ö£¬ÄÇ
event-bus ÊÇÓÃÀ´¸ÉʲôµÄÄØ£¿
ÓÃÀ´´¦ÀíÌØÊâÐèÇóµÄ£¬£¬£¬£¬ÄÇʲôÊÇÌØÊâÐèÇóÄØ£¬ÎÒ˵һÏÂÎÒÃÇÔÚʲôµØ·½Óõ½ÁËevent-bus
³¡¾°£º
ÎÒÃǵÄÏîÄ¿ÊÇ´¿Ç°¶ËÏîÄ¿£¬ÓÖÊǸö¹ÜÀíϵͳ£¬ËùÒԵǽ¹¦ÄܾͱȽÏÉñÆæ

ÉÏÃæÊǵǽµÄÕûÌåÁ÷³Ìͼ£¬¹ØÓڵǽǰ¶ËÐèÒª×ö¼¸¸öÊÂÇ飺
¼àÌýËùÓÐapiµÄÏìÓ¦£¬Èç¹ûδµÇ¼ºó¶Ë»á·µ»ØÒ»¸ö´íÎóÂë
Èç¹ûºó¶Ë·µ»ØÒ»¸öδµÇ¼µÄ´íÎóÂ룬ǰ¶ËÐèÒªÌø×ªµ½¹«Ë¾Í³Ò»µÄµÇ½ÖÐÐÄÈ¥µÇ½£¬µÇ½³É¹¦ºó»áÌø×ª»Øµ±Ç°µØÖ·²¢ÔÚurlÉÏЯ´øsid
¼àÌýËùÓзÓÉ£¬Èç¹û·¢ÏÖ·ÓÉÉÏ´øÓÐsid£¬ËµÃ÷ÊǴӵǽÖÐÐÄÌø¹ýÀ´µÄ£¬ÓÃÕâ¸ösidÈ¥ÇëÇóÒ»ÏÂÓû§ÐÅÏ¢
µÇ½³É¹¦²¢Äõ½Óû§ÐÅÏ¢
¾¹ýÉÏÃæÒ»ÏµÁеĵǽÁ÷³Ì£¬×îºóµÄ½á¹ûÊǵǽ֮ºó»áÄõ½Ò»¸öÓû§ÐÅÏ¢£¬Õâ¸ö»ñÈ¡Óû§ÐÅÏ¢µÄ²Ù×÷ÊÇÔÚrouterÀï·¢ÆðµÄÖ´ÐУ¬ÄÇôÎÊÌâ¾ÍÀ´ÁË£¬routerÖÐÄõ½ÁËÓû§ÐÅÏ¢ÎÒÏ£Íû°ÑÕâ¸öÓû§ÐÅÏ¢·Åµ½storeÀÒòΪÔÚrouterÖÐÄò»µ½vueʵÀý£¬ÎÞ·¨Ö±½Ó²Ù×÷vuexµÄ·½·¨£¬Õâ¸öʱºòÈç¹ûûÓÐ
event-bus ¾ÍºÜÄѲÙ×÷¡£
ËùÒÔͨ³£ event-bus ÎÒÃǶ¼»áÓÃÔÚ±íÏÖ²ãÏÂÃæµÄÆäËû²ã¼¶£¨Ã»ÓÐvueʵÀý£©Ö®¼äͨÐÅ£¬¶øÇÒ±ØÐëÒªºÜÇå³þ×Ô¼ºÔÚ×öʲô
Ϊʲô event-bus ºÜÈÝÒ׳öÎÊÌ⣿ºÃÏñËü¾ÍÊÇÒ»¸öÆÕͨµÄʼþ»úÖÆ¶øÒÑ£¬ÎªÊ²Ã´ÄÇôΣÏÕ£¿
ÕâÊǸöºÃÎÊÌ⣬ÎÒ˵һÏÂÎÒÔø¾Óöµ½µÄÒ»¸öÎÊÌâ¡£ÏÈÃèÊöÒ»¸öºÜ¼òµ¥µÄÒµÎñ³¡¾°£º¡°½øÈëÒ»¸öÒ³ÃæÈ»ºó¼ÓÔØÁÐ±í£¬È»ºóµã»÷ÁË·Ò³£¬ÖØÐÂÀȡһÏÂÁÐ±í¡±
ÓÃevent-busÀ´Ð´µÄ»°ÊÇÕâÑùµÄ£º
watch: {
'$route' () {
EventHub.$emit('word:refreshList')
}
},
mounted () {
EventBus.$on('word:refreshList', _ => {
this.changeLoadingState(true)
.then(this.fetchList)
.then(this.changeLoadingState.bind(this, false))
.catch(this.changeLoadingState.bind(this, false))
})
EventBus.$emit('word:refreshList')
} |
watch ·ÓÉ£¬µã»÷·Ò³ºó´¥·¢Ê¼þÖØÐÂÀȡһÏÂÁÐ±í£¬
¹¦ÄÜдÍêºó²âÊÔÁË·¢ÏÖ¹¦Äܶ¼ºÃʹ£¬Ã»Ê²Ã´ÎÊÌâ¾ÍÉÏÏßÁË
È»ºó¹ýÁ˼¸ÌìżȻһ´Î·¢ÏÖÔõô network ÀïÕâô¶àÖØ¸´µÄÇëÇ󣿵ãÁËÒ»´Î·Ò³Ôõô·¢ÁËÕâô¶à¸ö fetchList
µÄÇëÇ󣿣¿£¿Ê²Ã´Çé¿ö£¿£¿£¿£¿
ÕâÀïÓÐÒ»¸öÐÂÊÖºÜÈÝÒ׺öÂÔµÄÎÊÌ⣬¼´±ãÊǾÑé·Ç³£·á¸»µÄÈËÒ²»áÔÚ²»×¢ÒâµÄÇé¿ö·¸´í£¬ÄǾÍÊÇÉúÃüÖÜÆÚ²»Í¬²½µÄÎÊÌ⣬event-bus
µÄÉùÃ÷ÖÜÆÚÊÇÈ«¾ÖµÄ£¬Ö»ÓÐÔÚÒ³ÃæË¢ÐµÄʱºò event-bus ²Å»áÖØÖÃÄÚ²¿×´Ì¬£¬¶ø×é¼þµÄÉùÃ÷ÖÜÆÚÏà¶ÔÀ´Ëµ¾Í¶ÌÁ˺ܶ࣬ËùÒÔÉÏÃæµÄ´úÂëµ±ÎÒ½øÈëÕâ¸ö×é¼þÈ»ºóÓÖÏú»ÙÁËÕâ¸ö×é¼þÈ»ºóÓÖ½øÈëÕâ¸ö×é¼þ·´¸´¼¸´ÎÖ®ºó¾Í»áÔÚ
event-bus ÖмàÌýÁ˺ܶà¸ö word:refreshList ʼþ£¬Ã¿´Î´¥·¢Ê¼þʵ¼Ê¶¼»áÓкöà¸öº¯ÊýÔÚÖ´ÐУ¬ËùÒԲŻáÔÚ
network Öз¢ÏÖN¶à¸öÏàͬµÄÇëÇó¡£
ËùÒÔ·¢ÏÖÕâ¸öbugÖ®ºó¸Ï½ô¼ÓÁ˼¸ÐдúÂë°ÑÕâ¸öÎÊÌâÐÞ¸´ÁË£º
destroyed () {
EventHub.$off('word:refreshList')
} |
×Ô´Ó³öÁËÕâ¸öÎÊÌâÖ®ºó£¬ÎÒ¾ÍÏñÓëÎÒһͬ¿ª·¢ºǫ́µÄС»ï°é˵ÁËÕâ¸öÊ£¬½¨ÒéËùÓÐÒµÎñÐèÇó×îºÃ²»ÒªÔÚʹÓÃevent-busÁË£¬³ý·ÇºÜÇå³þµÄÖªµÀ×Ô¼ºÕýÔÚ¸Éʲô¡£
·¢²¼ÉÏÏß
ÏîÄ¿¼Ü¹¹´î½¨ºÃÁËÖ®ºóÒѾ¿ÉÒÔ¿ªÊ¼Ð´ÒµÎñÁË£¬ËùÒÔÎÒÿÌìµÄ°×ÌìÊÇÔÚ¿ª·¢ÒµÎñ¹¦ÄÜ£¬ÍíÉϺÍÖÜÄ©µÄʱ¼äÓÃÀ´¿ª·¢±àÒëÉÏÏߵŦÄÜ
±àÒëÔ´Âë
Ç°ÃæËµÁËÎÒÃǵÄÏîÄ¿ÊÇ´¿Ç°¶Ë¹¤³Ì£¬ËùÒÔÆÚÍûÊDZàÒë³öÒ»¸öÎÞÈκÎÒÀÀµµÄ´¿htmlÎļþ

ÔÚʹÓà vue-cli ³õʼ»¯ÏîÄ¿µÄʱºò£¬¹Ù·½µÄ webpack Ä£°å»á°ÑwebpackµÄÅäÖö¼ÉèÖúã¬ÏîÄ¿Éú³ÉºÃÁËÖ®ºóÖ±½ÓÔËÐÐ
npm run build ¾Í¿ÉÒÔ±àÒëÔ´Â룬µ«ÊDZàÒë³öÀ´µÄhtmlÖÐÒÀÀµµÄjs¡¢cssÊDZ¾µØµÄ£¬ËùÒÔÎÒÏÖÔÚÒª×öµÄÊÂÇé¾ÍÊÇÏë°ì·¨°ÑÕâЩ±àÒëºóµÄ¾²Ì¬ÎļþÉÏ´«cdn£¬È»ºó°ÑhtmlÖеı¾µØµØÖ·Ìæ»»³ÉÉÏ´«cdnÖ®ºóµÄµØÖ·
ÏîÄ¿ÊÇͨ¹ýwebpack²å¼þ HtmlWebpackPlugin À´Éú³ÉhtmlµÄ£¬ËùÒÔÎÒÏëÕâ¸ö²å¼þÓ¦¸Ã»áÓнӿÚÀ´¸¨ÖúÎÒÍê³ÉÈÎÎñ£¬ËùÒÔÎҲ鿴ÁËÕâ¸ö²å¼þµÄÎĵµ£¬·¢ÏÖÕâ¸ö²å¼þ»á´¥·¢Ò»Ð©Ê¼þ£¬ÎҸоõÕâЩʼþÓ¦¸Ã¿ÉÒÔ°ïÖúÎÒÍê³ÉÈÎÎñ£¬ËùÒÔÎÒдÁËdemoÀ´³¢ÊÔһϸ÷¸öʼþ¶¼ÊǸÉʲôÓõÄÒÔ¼°ÓÐÊ²Ã´Çø±ð£¬¾¹ý³¢ÊÔ·¢ÏÖÁËÒ»¸öʼþÃû½Ð
html-webpack-plugin-alter-asset-tagsµÄʼþ¿ÉÒÔ°ïÖúÎÒÍê³ÉÈÎÎñ£¬ËùÒÔÎÒдÁËÏÂÃæÕâÑùµÄ´úÂ룺
var qcdn = require('@q/qcdn')
function CdnPlugin (options) {}
CdnPlugin.prototype.apply = function (compiler)
{
compiler.plugin ('compilation', function(compilation)
{
compilation.plugin ('html-webpack-plugin -alter-asset-tags',
function (htmlPluginData, callback) {
console.log ('> Static file uploading cdn...')
var bodys = htmlPluginData.body.map (upload(compilation,
htmlPluginData, 'body'))
var heads = htmlPluginData.head.map (upload(compilation,
htmlPluginData, 'head'))
Promise.all (heads.concat(bodys))
.then(function (result) {
console.log ('> Static file upload cdn done!')
callback (null, htmlPluginData)
})
.catch(callback)
})
})
}
var extMap = {
script: {
ext: 'js',
src: 'src'
},
link: {
ext: 'css',
src: 'href'
},
}
function upload (compilation, htmlPluginData,
type) {
return function (item, i) {
if (!extMap[item.tagName]) return Promise.resolve()
var source = compilation.assets [item.attributes[extMap [item.tagName].src].replace(/^(\/)*/g,
'')].source()
return qcdn.content (source, extMap [item.tagName].ext)
.then(function qcdnDone(url) {
htmlPluginData [type][i].attributes [extMap[item.tagName].src]
= url
return url
})
}
}
module.exports = CdnPlugin |
ÆäʵÔÀí²¢²»¸´ÔÓ£¬compilation.assets Àï±£´æÁËÎļþÄÚÈÝ£¬htmlPluginData
Àï±£´æÁËÈçºÎÊä³öhtml£¬ ËùÒÔ´Ó compilation.assets ÖжÁÈ¡µ½ÎļþÄÚÈÝÈ»ºóÉÏ´«CDN£¬È»ºóÓÃÉÏ´«ºóµÄCDNµØÖ·°ÑhtmlPluginData
Öеı¾µØµØÖ·Ìæ»»µô¾ÍÐÐÁË¡£
È»ºó½«Õâ¸ö²å¼þÌí¼Óµ½build/webpack.prod.conf.jsÅäÖÃÎļþÖС£
ÕâÀïÓиö¹Ø¼üµãÊÇ£¬htmlÖеÄÒÀÀµºÍ¾²Ì¬ÎļþÖеÄÒÀÀµÊDz»Í¬µÄ´¦Àí·½Ê½¡£
ʲôÒâË¼ÄØ£¬¾Ù¸öÀý×Ó£º
Ô´Âë±àÒëºóÉú³ÉÁ˼¸¸ö¾²Ì¬Îļþ£¬°ÑÕâЩ¾²Ì¬ÎļþÉÏ´«µ½cdn£¬È»ºóÓÃcdnµØÖ·Ìæ»»µôhtmlÀïµÄ±¾µØµØÖ·£¨¾ÍÊÇÉÏÃæCdnPlugin¸Õ¸Õ×öµÄÊÂÇ飩
ÄãÒÔΪÍêÊÂÁË£¿ No£¡No£¡No£¡
CdnPlugin Ö»ÊǰÑÔÚhtmlÖÐÒýÈëµÄ±àÒëºóµÄjs£¬cssÉÏ´«ÁËcdn£¬µ«ÊÇjs£¬cssÖÐÒýÈëµÄͼƬ»òÕß×ÖÌåµÈÎļþ²¢Ã»ÉÏ´«cdn
Èç¹û´úÂëÖÐÒýÈëÁ˱¾µØµÄij¸öͼƬ»ò×ÖÌ壬±àÒëºóÕâЩµØÖ·»¹ÊDZ¾µØµÄ£¬´ËʱµÄhtmlÊÇÓÐÒÀÀµµÄ£¬ÊDz»´¿µÄ£¬Èç¹ûÖ»°ÑhtmlÉÏÏßÁË£¬´úÂëÖÐÒÀÀµµÄÕâЩͼƬºÍ×ÖÌåÔÚ·þÎñÆ÷ÉÏÕÒ²»µ½Îļþ¾Í»áÓÐÎÊÌâ
ËùÒÔÐèÒªÏȰÑÔ´ÂëÖÐÒÀÀµµÄ¾²Ì¬Îļþ£¨Í¼Æ¬£¬×ÖÌåµÈ£©ÉÏ´«µ½cdn£¬È»ºóÔڰѱàÒëºóµÄ¾²Ì¬Îļþ£¨js£¬css£©ÉÏ´«cdn¡£
´úÂëÖÐÒÀÀµµÄ¾²Ì¬ÎļþÀýÈçͼƬ£¬ÔõôÉÏ´«cdnÄØ£¿
´ð°¸ÊÇÓà loader À´ÊµÏÖ£¬webpack ÖÐµÄ loader ÒÔÎÒµÄÀí½âËüÊÇÒ»¸öfilter£¬»òÕßÊÇÖмä¼þ£¬×ÜÖ®¾ÍÊÇ
import Ò»¸öÎļþµÄʱºò£¬Õâ¸öÎļþÏÈͨ¹ýloader ¹ýÂËÒ»±é£¬°Ñ¹ýÂ˺óµÄ½á¹û·µ»Ø£¬¹ýÂ˵Ĺý³Ì¿ÉÒÔÊÇ
babel ÕâÖÖ±àÒë´úÂ룬µ±È»Ò²¿ÉÒÔÊÇÉÏ´«cdn£¬ËùÒÔÎÒдÁËÏÂÃæÕâÑùµÄ´úÂ룺
var loaderUtils
= require('loader-utils')
var qcdn = require('@q/qcdn')
module.exports = function(content) {
this.cacheable && this.cacheable()
var query = loaderUtils.getOptions(this) ||
{}
if (query.disable) {
var urlLoader = require('url-loader')
return urlLoader.call(this, content)
}
var callback = this.async()
var ext = loaderUtils.interpolateName(this,
'[ext]', {content: content})
qcdn.content(content, ext)
.then(function upload(url) {
callback(null, 'module.exports = ' + JSON.stringify(url))
})
.catch(callback)
}
module.exports.raw = true |
Æäʵ¾ÍÊÇ°Ñ content ÉÏ´«CDN£¬È»ºó°ÑCDNµØÖ·Å׳öÈ¥
ÓÐÁËÕâ¸öloader Ö®ºó£¬ÔÚ import ͼƬµÄʱºò£¬Äõ½µÄ¾ÍÊÇÒ»¸öcdnµÄµØÖ·~
µ«ÊÇÎÒ²»ÏëÔÚ¿ª·¢»·¾³Ò²ÉÏ´«cdn£¬ÎÒÏ£ÍûÖ»ÓÐÔÚÉú³É»·¾³²ÅÓÃÕâ¸öloader£¬ËùÒÔÎÒÉèÖÃÁËÒ»¸ö disable
µÄÑ¡ÏÈç¹û disable Ϊ true£¬ÎÒʹÓà url-loader À´´¦ÀíÕâ¸öÎļþÄÚÈÝ¡£
×îºó°ÑloaderÒ²Ìí¼Óµ½ÅäÖÃÎļþÖУº
rules: [
...,
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: path.join(__dirname, 'cdn-loader'),
options: {
disable: !isProduction,
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
}
] |
дºÃÁË cdn-loader ºÍ cdn-plugin Ö®ºó£¬ÒѾ¿ÉÒÔ±àÒë³öÒ»¸öÎÞÈκÎÒÀÀµµÄ´¿html£¬ÏÂÒ»²½¾ÍÊǰÑÕâ¸öhtmlÎļþ·¢²¼ÉÏÏß
·¢²¼ÉÏÏß
ÎÒÃDz¿ÃÅÓÐ×Ô¼ºµÄ·¢²¼ÉÏÏߵŤ¾ß½Ð hera ¿ÉÒÔ°Ñ´úÂë·¢²¼µ½docker»úÉϽøÐбàÒ룬Ȼºó°Ñ±àÒëºóµÄ´¿htmlÎļþ·¢²¼µ½ÊÂÏÈÅäÖúõķþÎñÆ÷µÄÖ¸¶¨Ä¿Â¼ÖÐ
±àÒëµÄÁ÷³ÌÊÇÏȰѴúÂë·¢²¼µ½±àÒë»úÉÏ -> ±àÒë»úÆô¶¯ docker £¨docker¿ÉÒÔ±£Ö¤±àÒë»·¾³Ïàͬ£©
-> ÔÚ docker ÖÐÖ´ÐÐ npm install °²×°ÒÀÀµ -> Ö´ÐÐ npm run
build ±àÒë -> °Ñ±àÒëºóµÄ html ·¢Ë͵½·þÎñÆ÷
ÒòΪÿ´Î±àÒë¶¼ÐèÒª°²×°ÒÀÀµ£¬Ëٶȷdz£Âý£¬ËùÒÔÎÒÃÇÓÐÒ»¸ö diffinstall µÄÂß¼£¬Ã¿´Î°²×°ÒÀÀµ¶¼»á½øÐÐÒ»´Î
diff£¬°ÑÓлº´æµÄÖ±½ÓÓûº´æcopyµ½node_modules£¬Ã»»º´æµÄʹÓÃqnpm°²×°£¬Ö®ºó»á°ÑÕâ´Îа²×°µÄÒÀÀµ»º´æÒ»·Ý¡£ÒÀÀµ»º´æÁËÖ®ºóÿ´Î°²×°ÒÀÀµËÙ¶ÈÃ÷ÏÔ¿ìÁ˺ܶࡣ
ÏÖÔÚÏîÄ¿ÒѾ¿ÉÒÔÕý³£¿ª·¢ºÍÉÏÏßÀ²~
api-proxy
ËäÈ»ÏîÄ¿¿ÉÒÔÕý³£¿ª·¢ÁË£¬µ«ÎÒ¾õµÃ»¹²»¹»£¬ÎÒÏ£ÍûÏîÄ¿¿ÉÒÔÓÐ mock Êý¾ÝµÄ¹¦Äܲ¢ÇÒ¿ÉÒÔ¼ì²é·þÎñ¶Ë·µ»ØµÄÊý¾ÝÊÇ·ñÕýÈ·£¬¿ÉÒÔ±ÜÃâÒòΪ½Ó¿Ú·µ»ØÊý¾Ý²»ÕýÈ·µÄÎÊÌâdebugºÃ¾Ã¡£
ËùÒÔÎÒ¿ª·¢ÁËÒ»¸ö¼òµ¥µÄÄ£¿é api-proxy £¬¾ÍÊÇ·â×°ÁËÒ»¸öhttp client£¬¿ÉÒÔÅäÖÃÇëÇóÐÅÏ¢ºÍMock
¹æÔò£¬¿ªÆôMockµÄʱºòʹÓÃMock¹æÔòÉú³ÉMockÊý¾Ý·µ»Ø£¬²»¿ªÆôMockµÄʱºòʹÓÃMock¹æÔòÀ´Ð£Ñé½Ó¿Ú·µ»ØÊÇ·ñ·ûºÏÔ¤ÆÚ¡£
ÄÇô api-proxy ÔõÑùʹÓÃÄØ£¿
¾Ù¸öÀý×Ó£º
.
©¸©¤©¤ api
©¸©¤©¤ log
©À©¤©¤ index.js
©¸©¤©¤ fetchLogs.js |
/*
* /api/log/fetchLogs.js
*/
export default {
options: {
url: '/api/operatelog/list',
method: 'GET'
},
rule: {
'data': {
'list|0-20': [{
'id|3-7': '1',
'path': '/log/opreate',
'url': '/operate/log?id=3',
'user': 'berwin'
}],
'pageData|7-8': {
'cur': 1,
'first': 1,
'last': 1,
'total_pages|0-999999': 1,
'total_rows|0-999999': 1,
'size|0-999999': 1
}
},
'errno': 0,
'msg': '²Ù×÷ÈÕÖ¾Áбí'
}
}
/*
* /api/log/index.js
*/
import proxy from '../base.js'
import fetchLogs from './fetchLogs.js'
export default proxy.api({
fetchLogs
}) |
ʹÓãº
import log from
'@/api/log'
log.fetchLogs(query)
.then(...) |
¿¼Âǵ½ÌØÊâÇé¿ö£¬Ò²²¢²»ÊÇÇ¿ÖÆ±ØÐëÕâÑùʹÓã¬ÎÒ»¹ÊÇÅ׳öÁËÒ»¸ö api·½·¨À´¹©¿ª·¢ÕßÕý³£Ê¹Óã¬ÀýÈ磺
// ²»Ê¹ÓÃapi-proxyµÄapi
import {api} from './base'
export default {
getUserInfo (sid) {
return api.get('/api/user/getUserInfo', {
params: {
sid
}
})
}
} |
Õâ¸ö api ¾ÍÊÇ axios £¬²¢Ã»×öÊ²Ã´ÌØÊâ´¦Àí¡£
³õʼ»¯ÅäÖÃÎļþ
ÏîÄ¿¿ª·¢ÖлáÓõ½Ò»Ð©ÅäÖÃÎļþ£¬±ÈÈ翪·¢»·¾³ÐèÒªÅäÖÃÒ»¸öserverµØÖ·ÓÃÀ´ÉèÖÃapiÇëÇóµÄserver¡£¿ª·¢»·¾³µÄÅäÖÃÎļþÿ¸öÈ˶¼²»Ò»Ñù£¬ËùÒÔÎÒÔÚ
.gitignore ÖаÑÕâ¸ödev.conf ÆÁ±Îµô£¬²¢Ã»ÓÐÈëµ½°æ±¾¿âÖУ¬ËùÒԾʹøÀ´ÁËÒ»¸öÎÊÌ⣬ÿ´ÎÓÐÐÂÈ˽øÈëµ½Õâ¸öÏîÄ¿£¬ÔÚµÚÒ»´Î´î½¨ÏîÄ¿µÄʱºò£¬×ÜÊÇÒªÊÖ¶¯´´½¨Ò»¸ö
dev.conf Îļþ£¬ÎÒÏ£ÍûÄÜ×Ô¶¯´´½¨ÅäÖÃÎļþ
ÕýÇÉ֮ǰÎÒдÁËÒ»¸öÀàËÆÓÚ vue-cli µÄ¹¤¾ß speike-cli£¬Ò²ÊÇͨ¹ýÄ£°åÉú³ÉÏîÄ¿µÄÒ»¸ö¹¤¾ß£¬ËùÒÔÕâÒ»´ÎÕýºÃÅÉÉÏÓ󡣬ÎÒ°ÑÅäÖÃÎļþ¶¨ÒåÁËÒ»¸öÄ£°å£¬È»ºóʹÓÃ
speike À´Éú³ÉÁËÒ»¸öÅäÖÃÎļþ
// package.json
{ "scripts": { "init":
"speike init ./config/init-tpl ./config/dev.conf"
}
} |

³õʼ»¯ÏîÄ¿
Õâ´Î¸ÃÓеͼÓÐÁË£¬¿ÉÒÔÓä¿ìµÄдÂëÁË£¬ÎªÁËÒÔºóÓÐÀàËÆµÄ¹ÜÀíϵͳ´´½¨ÏîÄ¿·½±ã£¬ÎÒ°ÑÕâ´Î¾«ÐÄÉè¼ÆµÄ¼Ü¹¹£¬±àÒëÂß¼µÈ¶¨ÖƳÉÁËÄ£°å£¬ÈÕºó¿ÉÒÔÖ±½ÓʹÓÃspeike
Ñ¡ÔñÕâ¸öÄ£°åÀ´Éú³ÉÏîÄ¿¡£

ÕûÀíÓë×ܽá
¾¹ýÉÏÃæÒ»ÏµÁÐ×öµÄÊ£¬×îºóÕûÀíÒ»ÏÂÏîÄ¿¹¤³Ì»¯µÄÉúÃüÖÜÆÚ

|