版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
全文3000字,歡迎點(diǎn)贊轉(zhuǎn)發(fā)事情是這樣的,某天有個(gè)小伙伴問我:為啥我的webpack運(yùn)行完看不到我寫的頁面,而是:listingdirectory/。。①localhost9000distOwebpack.conf^g.js嗯?文件列表頁?好吧,這種情況我似乎沒遇到過,一下子沒法給出答案,只能要來關(guān)鍵代碼:isisindex.isux tD0CD…test-hmr>src>nindex.js>一1constnod*■document.createEle?ent('(Jlv*)2node.innerText,'test,3 document.body.appendCh1Id^node^test-hmr>public><>index.htmi>傘htrnl>0body<100CTYPfhtal>a<hc*d>eetacharset?MUTF-8-><aetdhttp??quiv?"X-UAYy>atible"content,”IE**6 <metanames"viewport*content^'width^device-?ld<tltie>Docu?ient*/title*</head><t>ody>1?</body>
?webp?ck.c8glsUxtest-hmr>.webpack.config.js>M〈unknown〉>fldevServ1 constpath?require("pathM);constHtalWeb^ackPlu9m=require(,htal-webpackaodule.exports"{entry:*./src/indexMfaode:"developsent。devtool:false,output:{filename:M(naae).jsNtpublicPath:path:path.Join,_dlrna?ef》?devServer:《coopress:true,inline:true,hot:true.port:9?M,open:true19樂plugins:InewHtalWebpackPlugin({tcaplate:*./public/index.htaVTOC\o"1-5"\h\z})】}:重點(diǎn)看看wehpack.config.js配置,用到devServer+HMR功能,其中:Webpack版本為5.37.0webpack-dev-server版本為3.11.2看了半天,沒問題呀,給了幾個(gè)紙糊的建議還是解決不了問題,剛好在開會(huì)這事就暫且放下了。過了一會(huì),小伙伴興沖沖跑過來跟我說經(jīng)過一番盲猜,問題被解決了:output.publicPatk=時(shí)一'切正常output.pu匕〃ePath=7,時(shí)出錯(cuò),返回文件列表頁?。窟@玩意還會(huì)影響aevSewer的效果,直覺告訴我不應(yīng)該啊。emmm,成功勾起我的好奇心了,雖然寫過一些Webpack源碼分析的文章,但webpack-dev-server確實(shí)不在我的知識(shí)范圍,好在我有秘籍《如何閱讀源碼——以Vetur為例》,是時(shí)候展示真正的技術(shù)了!第一步:定義問題先復(fù)盤一下問題發(fā)生的過程:webpack.co八fig.js同時(shí)配置了oupat.pub/icP戊人與devServer運(yùn)行npxwebpackserve啟動(dòng)開發(fā)服務(wù)器瀏覽器訪問http:〃(ocalhost:q。。。沒有按預(yù)期返回用戶代碼,而是返回了文件列表頁面;但如果恢復(fù)?!ㄖ形?小加icP〃協(xié)的默認(rèn)配置,一切如常講道理,。叩戊.仆如百〃兒應(yīng)該只是影響了最終產(chǎn)物引用的路徑,試試命令行工具運(yùn)行檢測(cè)首頁返回的內(nèi)容:,~curlhttp://localhost:9000<?DOCTYPEhtml><head><metachorset?'utf-8'>rnntFnt."*idtb?device?width,initial*scale-1.0tmaxxmum-scale-1.0,user-sealobie-n<title>listingdirectory/</title> margin:0;padding:0;outline:0;)body{podding:80Px100px;font:13px"HelveticaNeue","lucid。Grande","Arial";background:#ECE9E9-webkit-gradient(linear,0%0%,0%100%, to(#ECE9E9));background:#ECE9E9-moz-linear-gradient(top,#fff,#ECE9E9);background*repeat:no-repeat;color:#555;-webkit-font-smoothing:antialiased;)hl,h2,h3{font-size:22px;color:#343434;}hl5,h2em{podding:0Spx;Tips:有時(shí)候可以試試?yán)@過瀏覽器的復(fù)雜邏輯,用最簡(jiǎn)單的工具驗(yàn)證http請(qǐng)求返回的內(nèi)容??梢钥粗痢埃?qǐng)求kttp:〃/oca/host:qooo地址返回一大串html代碼,且頁面的title為listingdirectory 也就是我們看到的文件列表頁面:listingdirectory/<-->CO①localhost9000(Search~/國(guó)dist ⑦public Nsrc@webpack.conf^g.js雖然不知道這是在那一層生成的,但可以肯定絕對(duì)不是我寫的,而且這是在HTTP層面發(fā)生的。所以問題的核心就是:為何Webpack的output.pub/icPath會(huì)影響webpack-dev-ierver的運(yùn)行效果?第二步:回顧背景帶著問題我又review了一遍Webpack官方文檔。publicPath配置首先output.publicPath是這么描述的:Thisisanimportantoptionwhenusingon-demand-loadingorloadingexternalresourceslikeimages,files,etc.Ifanincorrectvalueisspecifiedyou'llreceive404errorswhileloadingtheseresources.大意就是,這是一個(gè)控制按需加載或資源文件加載的選項(xiàng),如果對(duì)應(yīng)的路徑資源加載失敗時(shí)會(huì)返回404?瞎,其實(shí)這段描述就非常不明所以了,簡(jiǎn)單理解。協(xié)會(huì)改變產(chǎn)物資源在html文件的路徑,比如說Webpack編譯完生成「bum.dle.js文件,默認(rèn)情況下寫到html的路徑是:(scriptsrc="bundle.js"/>如果設(shè)置了output.publicPath值,就會(huì)在路徑前增加前綴:〈scriptsrc="${output.publicPath}/bundle.js"/>看起來很簡(jiǎn)單。devServer配置項(xiàng)再來看看de.vSe.rver配置:Thissetofoptionsispickedupbywebpack-dev-serverandcanbeusedtochangeitsbehaviorinvariousways.大意就是,devServer配置最終會(huì)被webpack-dev-server消費(fèi),而webpack-dev-server提供了包括HMR 模塊熱更新在內(nèi)的web服務(wù)。感受一下,包括vue-cli、create-react-叩p之類的腳手架工具底層都依賴于webpack-dev-server,它的作用和重要性就可想而知了吧。第三步:分析問題按照現(xiàn)有的情報(bào),加上我對(duì)HTTP協(xié)議的理解,可以基本推斷問題必然是出在webpack-dev-server框架處理首頁請(qǐng)求的邏輯上,大概率是output.publicPatk屬性影響到首頁資源的判定邏輯,導(dǎo)致webpack-dev-server找不到對(duì)應(yīng)的資源文件,返回兜底的文件列表頁面。嗯,我覺得靠譜,那就沿著這個(gè)思路挖一挖源碼,找到具體原因吧。第四步:分析代碼結(jié)構(gòu)分析書上得來終須淺,debug還需看源碼啊,啥都別說了先打開webpack-dev-server包的代碼看看內(nèi)容吧:EXPLORER??? (}package.jsonXLEARN-WEBPACKnode_modules>webpack-dev-server>{}package.json>I7webpack-dev-server1{2“name":Hwebpack-dev-serverH,>bin3??version**:>client4,?description**:HServesawebpackapp.Updaylib5"bin":Hbin/webpack-dev-server.jsH.yservers67"main":Mlib/Server.jsHf?,files**:]?■bin”,JSBaseServer.js8JSSockJSServer.js9MUbHfJSWebsocketServer.js10MssVt|>utils11“client”()options.json12131]???engines**:{JSServer.js14“node":M>=6.11.5M>node_modules>ssl15),>Debug0CHANGELOG.mdHLICENSE161718,?scripts**:{Mlint:prettier1*:HprettierHeslint.—cache**,{}package.json19Hnpm-run-all-I-p(DREADME.md20"lint:type":Htsc—noEmitMr>webpack-log21Mcommittint11:"commitlint—from=masterHTips:讀者也可以試試clonewebpack-dev-server倉庫的代碼,有驚喜\~\~項(xiàng)目結(jié)構(gòu)并不復(fù)雜,按Webpack的習(xí)慣可以推斷主要代碼都在他目錄:?webpack-dev-servergit:(master)xcloc./lib27textfiles.27uniquefiles.0filesignored.github.co(n/AlDaniaUclocv1.90T=0.075;(376.2files/s.39269.3lines/s)LanguagefilesblankccxwnentcodeJavaScript263872801652JSON100499SUM:273872802151c/oc是一個(gè)非常好用的代碼統(tǒng)計(jì)工具,官網(wǎng):/package...代碼量也就2000出頭,還好還好。接下來再打開packagejson文件,看看有哪些depenWcncg,一個(gè)個(gè)捋過去之后,與我們的問題強(qiáng)相關(guān)的依賴有:express:應(yīng)用不用多介紹「吧webpack-dev-Middleware:這個(gè)應(yīng)該大多數(shù)人沒有注意過,從官網(wǎng)文檔判斷這是一個(gè)橋接Webpack編譯過程與express的中間件serve-/Wex:提供特定目錄下文件列表頁面的express中間件?。?!按照這個(gè)描述,這鍋肯定出在serve-iMcx的調(diào)用上啊,感覺離答案很近了。局部分析
切入點(diǎn):驗(yàn)證serve-譏4ex包的作用經(jīng)過上面的分析,雖然我還不知道問題具體出在哪里,但大致可以判定跟serve-認(rèn)Hex包強(qiáng)相關(guān),先搜一下webpack-dev-server在哪些地方引用這個(gè)包:SEARCH Q==[*g)jsServer.jsX■?rvindw ?正? lib>isServerjs>七Server>@setupStiticS?fveindexFeature>?options.static.forE?MmIoMuda .,= ..t93。 setupStaticScrvelndexFeature(>{。的 931 serveindex=require(serve-IMcX*);MmtoexcludeG 933■■i 9342resultsin1file-Openineditor 9357AServer.%;ib 2constserveindex=r?quire("serve-index*);IIserve-indexdoesn'tfaNthroughnon-get… 93994S942943945946947948949950951952this.options?stat1c?f0rf?ch((staticOption)?>{staticOption.publicPith.for€ach((pubVlcPath)?(if(staticOption.serveindex){this.app.use(publlcPatht(req?restnext)=>{〃msrvc-*indexdoesn't[through t/hesdrequestif(req.Mthod!?*GET*Hreq.aethod!―“HEAD")國(guó)returnnext();serveindex(staticOption.directory,staticOption.servelndireq,res,next);?;>?:?;)很幸運(yùn),只在他/Server”文件中用到,那就簡(jiǎn)單多了,靜態(tài)分析調(diào)用語句前后的語句,大致上可以推導(dǎo)出:serve伉Hex調(diào)用被包裊在汝is.app.use內(nèi),推測(cè)this.app指向express不例,use函數(shù)用于注冊(cè)中間件,所以整個(gè)serveindex就是一個(gè)中間件除setupStaticServelAd.exFeature外,Server類型中還包含了其它命名為setupXXXFeature的函數(shù),基本上都用于添加express中間件,這些中間件組合拼裝出webpack-dev-server提供的HMR、proxy、ssl等功能
也看不出別的啥了,先做個(gè)對(duì)照實(shí)驗(yàn),運(yùn)行起來動(dòng)態(tài)分析代碼的實(shí)際執(zhí)行過程,驗(yàn)證到底是不是這個(gè)地方出錯(cuò)吧。先在serveIndex函數(shù)之前插入原bugger語句,之后:?先按照正常情況,也就是output.pub/icPatk=7,執(zhí)行ndbnpxwebpackserve,結(jié)果是如常打開了頁面,沒有命中斷點(diǎn),沒有中斷?再按照ouput.pu匕〃ePath=執(zhí)行ndbnpxwebpackserve,進(jìn)入斷點(diǎn):ICcmo*SoiMMKvtanwvBM?maryFUwabvatfi .Swvql?.G? [6ICcmo*SoiMMKvtanwvBM?maryFUwabvatfi .Swvql?.G? [6 \*0conttceRtMtteM?t- ??*■■■??4*74M…7a?薪;“蕓毛-ie<A"”-sArtey(Cf < ?-1<>411CORtMtlMe.f(lt?a)9( Mthl""thl?.a0t.vw(contt*?tB?M*?ibUcFattprotocoli,-p?if 一■r,l——?9NfyiO4|J力(E.arthod WU ?rMlWri(224144U.r^ratun:II?F*“ L>?」MrwInd?a(it?Bt<Icsmttrw)?26 Mh"F41tMcurvi(???141*>): ?Mckeftte<Mt<<4?MectU*9tQ*3.J429>**** < ?t?Ut(...)11*Ab?elut?UcUStrMf(ce?tcat4?4e.,neat)。?rw?rafl naaa?Mr*>■H(rvq.Mthod,-GTTMythod■MAO")<etc,。iwatdl???>,?A?rf(?rr)*vq> <ndaijlTI4Jt1 __?r0WSf*W c<. zz'-“,7(anwMMlkx?<%t14M413Mrvvlntfex(cef*t?NtlM?(<Uvmtrue>)(rtq.r?(n?Hl)4344)$>caflbackWvnpotna4J4MtufMBtchStaticF?atur?()(4]74XMUUMolselKKStrUtfluettew))||typ?of**nooBMinw*1MVW.QR,owf>Crr?r(rtaot<ftie*Itm?tsupported*4144?)?1mif(Array.l?Arr?y(ceart?>itBaM)l<C0Rfefttt?M.f?rtACh((ite?)o<44J,,4??*>-?UtWrU$trUf(!???))||typeof1..Ml r7<>Un?<n.C?Mif -nmnasS?wttopecMconho-i*/tiet1port:MM,open:',writeToOlsh:dlcFath:n??Nt?llM^eckFlavMi((taapUt?t'./pMBUcyiMea.r>?wet*ecioonAgjt、M >了 ,jaicoR?t*?(h?r?4?irv(*Mtw*)|■o^ul*.?apartt?(?utryta*./trc/lM?a'*laod?:fl:output:4Tips:ndbTips:ndb是一個(gè)開箱即用的nodedebugger工具,不需要做任何配置就能調(diào)試node應(yīng)用,非常方便0K,答案揭曉了,在ouput.pub/icPatk=,/場(chǎng)景卜會(huì)命中這個(gè)中間件,執(zhí)行serve伍Hex函數(shù)返回文件目錄列表,這很makesense。不過,作為一個(gè)有追求的程序員怎么會(huì)止步于此呢,我們繼續(xù)往下挖呀:到底是那一段代碼決定了流程會(huì)不會(huì)進(jìn)入serve伉dex中間件?切入點(diǎn):確定serveindex的上游中間件思考一下,express架構(gòu)的特點(diǎn)就是間通過next思考一下,express架構(gòu)的特點(diǎn)就是間通過next函數(shù)調(diào)起下一個(gè)中間件。基于中間件的洋蔥模型,而中間件之ResponseRequest嗯,有思路了,我們沿著webpack-dev-server的middleware隊(duì)列,找到serve/ndex之前都有哪些中間件,分析這些中間件的代碼應(yīng)該就能解答:到底是那一段代碼決定了流程會(huì)不會(huì)進(jìn)入serve伉dex中間件?但是,express中間件架構(gòu)下,從調(diào)用到實(shí)際中間件函數(shù)隔著很遠(yuǎn)的調(diào)用鏈路,很難通過斷點(diǎn)的調(diào)用堆棧判斷出上一級(jí)中間件,以及更更上一級(jí)中間件在哪里?。?/p>
這時(shí)候不能硬剛,得換一個(gè)技巧了——找到創(chuàng)建express示例的代碼,用魔法包裹住use函數(shù):ndbConsoleSourcesPerformanceMemory㈤webpack.conftg.jsnoderfsServer.jsxindexes?J,,167 }168}).apply(piler);169 }170171701711721731741751761771781791801811821831841851861871881891901911Q2//Initexpressserver//eslint-disable-next-linenew-capthis.app=newexpressO;const_use=this.app.use;.app.yse=(???arg)=a{ara?[f]debug^ '_use7catl(this.app,...arg);目標(biāo)就是塞進(jìn)debugger命令setupHooksO{//ListeningforeventsconstinvalidPlugin=()=>{this.sockWrite(this.sockets,?invalid1);};constaddHooks=(compiler)q{const{?app.u-SwvecjsetupCompressFeatureSorvorJcompressServerj?app.u-SwvecjsetupCompressFeatureSorvorJcompressServerj(anonymous)Server.)setupFeaturesServer.jServerServer.)startDevServer startDevServer(anonymous)Index.jprocessTicksAndRejectionsI匕G+T,??無。iDebuggerpaused?Nodeprocesses?Watch▼CallStacknodeilntemal/p...task.queuawaitinprocessTicksAndRejectionB(listener index.)_parseCommand{}Line178,Column7Tips:這種技巧在某些復(fù)雜場(chǎng)景下特別有用,比如我在學(xué)習(xí)Webpack源碼的時(shí)候,就經(jīng)常配合Proxg類對(duì)hook植入debugger語句,追蹤鉤子被誰監(jiān)聽,在哪里被觸發(fā)通過這種重寫函數(shù),植入斷點(diǎn)的方式,我們就能輕松追溯到webpack-dev-server用到了哪些中間件,以及中間件注冊(cè)的順序:
setupCoi^pre^Feature=>注冊(cè)資源壓縮中間件setupMidd/ew〃憶=>注冊(cè)vjebpack-dev-middleware中間件set〃pStaticFe〃ture=>注冊(cè)靜態(tài)資源服務(wù)中間件setupServe伉dexFe〃t=>注冊(cè)serve伍dex中間件可以看到,在當(dāng)前Webpack配置下總共注冊(cè)了這四個(gè)中間件函數(shù),按照express的執(zhí)行邏輯這四個(gè)中間件會(huì)按注冊(cè)順序從上往下執(zhí)行,所以serve伉dex函數(shù)的直接上游就是setupStaticFeature注冊(cè)的靜態(tài)資源服務(wù)中間件了。繼續(xù)看看setupStaticFcature函數(shù)的代碼:362363364365362363364365366>379>396>414415416417418419420421constcontentBase=this.options.contentBase;constcontentBasePublicPath=this.options.contentBasePublicPatbif(Array.isArray(contentBase)){}elseif(isAbsoluteUrl(String(contentBase))){-}elseif(typeofcontentBase='number'){-?else國(guó)//routecontentrequestthis.app.use(contentBasePublicPath,express.static(contentBase,this.options.staticOptions));s}這里只是調(diào)用標(biāo)準(zhǔn)化的[expresss僅比J5ttp函數(shù),注入靜態(tài)資源服務(wù)功能,如果這個(gè)中間件運(yùn)行的時(shí)候按路徑找不到對(duì)應(yīng)的文件資源,會(huì)調(diào)用下一個(gè)中間件繼續(xù)處理請(qǐng)求,看起來跟我們的問題沒啥關(guān)系。繼續(xù)往上,看看setupMiddleware函數(shù):
220221222220221222223224225226227228229230231232233234this?app.use(this?niddleware);setupDevMiddleware(){//middlewareforservingwebpackbundlethis.middleware=webpackDevMiddleware(piler,Object.assign(<}fthis.options,{logLevel:this.log.options.level);)注冊(cè)了\^ebpack-dev-i^iddle\A/are,從名字就可以看出這個(gè)中間件跟weSpack-dw-server應(yīng)該關(guān)系匪淺,那就繼續(xù)打開\A/ebpack-dev-w\iddle\A/are看看里面的代碼:TOC\o"1-5"\h\z?webpack-dev-middleware 38I... 39~lib40JScontext.js 49JSDevMiddlewareError.js 59JS fs.js 60JS middleware.js 61? 63JSreporter.js64JSutil.js 65>node_modules 660CHANGELOG.md 67108Klicense 108Klicense 109{}package.json@README.md我去。。。也不少啊,這看起來太費(fèi)勁了,我只是想找到這個(gè)bug的原因,沒必要全看吧!那就直接搜關(guān)鍵詞publicpath試試吧:7webpack-dev-middleware'libJScontext.jsJSDevMiddlewareError.jsJSfs.jsJSmiddleware.jsJSreporter.jsJSutil.js>node_modules?CHANGELOG.mdJSindex.jsHLICENSE{}package.json?README.md38394049383940495960616364656667107108109webpack-dev-middleware,/lib/middleware.js文件中被使用了1次\A/cbpack-dev-i^iddle\A/are/lib/util.js文件中被使用了23次那,就先挑軟柿子捏,看看出以山ew〃憶Js文件中是怎么用的:const{getFileiaakv\eFroi^Url}=require(,./util,);^odule.exports=Functionw/apperfc。八七ext){returnfunctionMiddlewafe(ireq,next){functiongoNext。{//...resod(八ext());)//...letfileMkv\e=getFilcnakv\eFrokv\Url(context.options.publicPath}context.coi^piler,req.url);if(filename---false){returngoNextQ;}returnnewProFw/se((reso(ve)=>{ha^dleR.equest(contextJf〃e八〃Me,processReq〃est,req);//...1););注意代碼中有一*個(gè)邏輯,就是調(diào)用util文件的八〃hAeF/OFvvCM函數(shù),并判斷返回的fileMkvxe值是否為Fake,是的話調(diào)用next函數(shù),這看起來很像那么回事/!那就繼續(xù)進(jìn)去看看getFileiaai^eFroi^Url的代碼:JSmiddleware'sJ$util.js xnode.modules>webpack-dev-middleware>lib>JSutil.js>[e]<unknown>>0getFilenameFromUrl60module.exports={61getFilenameFromUrKpubPath,compiler,url){62 const{outputpath,publicPath}=getPaths(pubPathfcompiler,url);63 //localPrefixisthefolderourbundleshouldbein64constlocalPrefix=publicPath11*/\false,true);65 consturlObject=^dFse(url);66 letfilename;67consthostNameIsTheSame=localPrefix.hostname=urlObject.hostname; //publicPathhasthehostnamethatisnotthesameasrequesturl*s,should1if1TOC\o"1-5"\h\zlocalPrefix.hostname !- null &&urlObject.hostname != null 3!hostNamelsTheSameg{76 returnfalse;77 }7879 //publicPath isnotinurl,soitshcLidrail80if(publicPath&&hostNamelsTheSame圖url.indexOf(publicPath)!=6){81 returnfalse; ,82 )8384 //striplocalPrefixfromthestartofurl85 if(urlObJect.pathname.indexOftlocalPrefix.pathname)=0){86 filename=ur10bject?pathname.substr(localPrefix.pathname.length);87 }oo逐行分析下來,注意看紅框框出來這一句:rffxxx&&url.i^dexOf(publicPath)!==O){returnFake;
講道理,從字面意義上這個(gè)〃”應(yīng)該是客戶端發(fā)過來的請(qǐng)求連接,仆McP%應(yīng)該QlocatKMtJOOO?Mwbpacfc.conAg.就是我們?cè)趙ebpack.co八figjs中配置的output.publicPath項(xiàng)的值了吧?運(yùn)行起來看看:QlocatKMtJOOO?Mwbpacfc.conAg.>>webp?c*ieof*9i?>M<urMino?ft?>?pkjgintI 3tMpet1**l"W'i2 constKt?lMebo?ck*lu9in■rc^uiretISM6gsMMssMs7?nnn”nMnmr>MllguMM*oIwabcaatAaonto.San*.S.?■<9?tFileftaaeFroaUfUout*F?th4coapiUr,?rt)<ISM6gsMMssMs7?nnn”nMnmr>MllguMM*oIwabcaatAaonto.San*.S.?■<9?tFileftaaeFroaUfUout*F?th4coapiUr,?rt)<■.,(out(uf^ath,pvbllc^ath)?9?t^ethstp//l?c?lFre^xa1cthefolilrrpyrOuntfte>Mw[]c??t ?p?rt?<?ublU*Bth||V,c?t?ti?rl06)?ct?parM<url)|urlObject?VrWtf■uMeftAMCM*ttestMMalsTMSMt-UcalFrvfU.hMtA〃 IkMtMA0tr*M*tA*f11(WffhItoe41mx1■■suit44urUWJtct.hottMMe!??aUUsQjecQ■'hottMMcBTheSMeMftNaMltTMSaK?tn?I<.r?twrn>PIf ftlnsssnrsHTisre2cfalMj>〃”r“l(fā)-t/ef"fra*tM”xr。,ufllOhtMft.nathnM^.ifwWaOf<larAl^t?ft?.gta.CoMm90 QOdMXiat?CMbugvarpauaad?CaBSiac*?Scop0,L?C?l?c(wH?nC-It”,<Moktt3.naaeidwfim.parent.ni?*awiu?d?nhottMaaeXsTh?MM:trve?loc?l>r?fiatJr'.<>r?<oc?lt”,;'、. ”.,:.wtht_vel:*/?'?"?91■"1<pret*coli"■---, : -dueGlttel qUtel0FM?ipaM?Egentry:?"■dMek.■o4e;"tfewlovaent**dsvtool:f?lw,OUtftft:<fit——t*11L-[*/h<U<M9rV<,.|'—iniNY,.gkiH_JHW.”>.devScrver:(c?ap,cs:trw?Mtitrw4part:M
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 豬牛羊養(yǎng)殖場(chǎng)租賃合同范本
- 空調(diào)補(bǔ)充合同范本
- 運(yùn)輸年合同范本
- 健身加盟合同范本
- 人物宣傳合同范本
- 提供車位合同范本
- 年度分布式能源競(jìng)爭(zhēng)策略分析報(bào)告
- 2025屆廣東省廣州市番禺區(qū)實(shí)驗(yàn)中學(xué)物理高三第一學(xué)期期中達(dá)標(biāo)檢測(cè)模擬試題含解析
- 2025屆四川省成都市龍泉一中、新都一中等九校物理高二第一學(xué)期期中綜合測(cè)試試題含解析
- 2025屆青海省物理高三上期中考試試題含解析
- 鍍鋅板通風(fēng)管工程施工方案
- 助產(chǎn)職業(yè)生涯規(guī)劃書
- 體外診斷試劑注冊(cè)申報(bào)資料模板-穩(wěn)定性研究資料
- 艾賓浩斯遺忘曲線-計(jì)劃表《遺忘曲線》
- 福建省泉州市德化縣2023-2024學(xué)年七年級(jí)上學(xué)期期中考試道德與法治試題
- 信息資源目錄編制規(guī)范(用于個(gè)人參考學(xué)習(xí)版本)
- 互聯(lián)網(wǎng)的定義及發(fā)展歷程
- 綜掘機(jī)、綜掘工藝專項(xiàng)安全風(fēng)險(xiǎn)辨識(shí)評(píng)估報(bào)告
- 基層工會(huì)內(nèi)部控制制度范文五篇
- 馬克思主義基本原理智慧樹知到課后章節(jié)答案2023年下齊魯工業(yè)大學(xué)
- 社會(huì)學(xué)課件-階級(jí)和階層完整版
評(píng)論
0/150
提交評(píng)論