<a href="https://s3.51cto.com/wyfs02/M00/9A/2A/wKiom1lSNCLzne2yAAAYN-kvG4s029.png-wh_500x0-wm_3-wmp_4-s_3676625829.png" target="_blank"></a>
這個報錯說明需要安裝相應的Loader,并在引用時指定相應的loader
執行成功如圖:
<a href="https://s3.51cto.com/wyfs02/M01/9A/2A/wKiom1lSNCziWge8AAAujBht47U969.png-wh_500x0-wm_3-wmp_4-s_3959820103.png" target="_blank"></a>
chunk指相應的區塊。
要是css引入正确:必須引入css-loader,要使改變的css生效,要引入style-loader;
各個js的函數調用隻能在各自的函數中寫,引入隻是合并的意思,但并不能直接使用引入的js的函數。
而且style-loader要寫在css-loader的前面,否則報如下錯誤。
<a href="https://s4.51cto.com/wyfs02/M01/9A/2B/wKioL1lSND3R-FJgAAAf48LhHIQ688.png-wh_500x0-wm_3-wmp_4-s_1619917425.png" target="_blank"></a>
<a href="https://s4.51cto.com/wyfs02/M02/9A/2A/wKiom1lSND3yRbRmAAAdNjWH1zE518.png-wh_500x0-wm_3-wmp_4-s_1743294142.png" target="_blank"></a>
執行成功之後,css插入到了head标簽裡。
loader正确順序:”style-loader!css-loader!./style.css”
loader的加載順序是從右向左加載,是以
loader正确順序::style-loader!css-loader!postcss-loader!less-loader
sass-loader或者less-loader等語言預編譯loader在webpack中的位置為:
1.最先放sass-loader或者less-loader
2.postcss-loader
3.css-loader
4.style-loader
注意:如果一個css中import導入另一個css,另一個css的postcss-loader沒生效,這時要給css-loader加一個參數,指定import導入css的數量:
loader:’style-loader!css-loader?importLoaders=1!postcss-loader’
為了使用簡便,不能每次在引入css的時候加loader,則可以在指令中實作:
webpack hello.js bundle.js --module-bind 'css=style-loader!css-loader'
去掉子產品引入css時加入的loader,1.x可以,3.0依舊會報錯。
--watch
在指令後面加 --watch ,可以不用每次改動都執行指令,而是自動改變
注意:修改了webpack配置需要重新開機,即即使設定了監聽也要手動重新編譯;
關于版本安裝問題:把想要安裝的npm 子產品的名稱和版本号寫在package.json的依賴裡,然後npm install就會自動安裝
但是,每次輸入很多指令依舊很繁瑣,解決辦法:
如果要提前配置好輸入的webpack指令,則在package.json中的script下,定義一個webpack屬性,後面定義所有要輸入的webpack的指令,定義好之後,在指令視窗 運作 指令 npm run webpack即可,定義方式與定義npm run dev中的dev是一樣的。
<a href="https://s5.51cto.com/wyfs02/M02/9A/2A/wKiom1lSNFSiYdGNAAAhxS5ZBaY741.png-wh_500x0-wm_3-wmp_4-s_2200484769.png" target="_blank"></a>
--progress 檢視打包過程
--display-modules 檢視打包的子產品
--colors 打包後的指令加顔色區分
--display-reasons 顯示打包原因
--watch 自動監聽檔案改變,若改動,自動打包,但是修改webpack配置需重新手動編譯。
報錯:
<a href="https://s5.51cto.com/wyfs02/M02/9A/2B/wKioL1lSNGGAAld7AAAWIM2yUks929.png-wh_500x0-wm_3-wmp_4-s_4045632248.png" target="_blank"></a>
output輸出的路徑寫成這樣:
<a href="https://s4.51cto.com/wyfs02/M01/9A/2B/wKioL1lSNHvxBwjbAAAVCkOGV2M991.png-wh_500x0-wm_3-wmp_4-s_3396784820.png" target="_blank"></a>
而不是這樣:
<a href="https://s5.51cto.com/wyfs02/M02/9A/2A/wKiom1lSNIbgUcAAAAANoOd7rFQ815.png-wh_500x0-wm_3-wmp_4-s_3249762308.png" target="_blank"></a>
webpack打包完成之後,顯示打包成功,但是并沒有生産打包的檔案和檔案夾,是以這裡在path中切記首先要寫__dirname+“路徑”
如圖:
<a href="https://s5.51cto.com/wyfs02/M02/9A/2B/wKioL1lSNJnQaB0wAAAZI1TIVC4696.png-wh_500x0-wm_3-wmp_4-s_561672318.png" target="_blank"></a>
個人了解:如果寫成 __dirname+”/path”,則說明現在還沒有要放入的js的檔案夾,這樣會自動建立,否則即使執行成功,但是會看不到打包後的js檔案,如果已經提前建立好要打包的js的存放檔案夾,則不需要寫__dirname. 【常見問題】
如果更改了入口檔案的數量,比如變成數組形式,或者對象形式,則需要重新手動運作npm run webpack。
數組:用數組形式寫多個入口檔案,則會合并成指定的一個打包之後的檔案
對象:分别打包成多個檔案
注意:一個chunk代表一個區塊,則不同的chunk會打包成不同的檔案,如果output寫死成一個路徑,則打包之後第二個區塊會覆寫第一個區塊,解決辦法,chunkname+hash作為占位,則有幾個區塊就打包成幾個區塊 filename: "[name]-[hash].js"
報錯原因:入口檔案的路徑寫成了單引号套雙引号,是以不識别。
<a href="https://s3.51cto.com/wyfs02/M01/9A/2A/wKiom1lSNK7gz8BtAAA8E0K3TTI160.png-wh_500x0-wm_3-wmp_4-s_4223127714.png" target="_blank"></a>
hash值可以了解為版本号,隻有檔案發生改變時,hash值才會變化。
hash值對靜态資源的版本管理很有用。
npm安裝該插件
npm install 插件名 --save-dev
一個很好用的webpack插件:html-webpack-plugin
安裝
<code>npm </code><code>install</code> <code>html-webpack-plugin --save-dev</code>
使用:
首先在webpack.config.js中引入該插件,
var htmlWebpackPlugin = require('html-webpack-plugin');
然後隻需要在webpack配置中modules增加屬性plugins,用來初始化插件。
寫法如下:
<code>plugins: [</code>
<code>new</code> <code>htmlWebpackPlugin() </code>
<code>]</code>
如果要把自己的html頁面打包到對應的打封包件夾下:則給該插件映射一個模版:
<code>new</code> <code>htmlWebpackPlugin({</code>
<code>template:”index.html”</code>
<code>})</code>
如果html頁面想要輸出到打封包件夾最外層目錄,然後js等檔案要輸出到js對應的檔案夾下,則output輸出的時候把js路徑單獨配置到對應的目錄下的filename就可以。
代碼如圖:
<code>output: {</code>
<code> </code><code>filename: </code><code>"js/[name]-[hash].js"</code><code>,</code>
<code> </code><code>path: __dirname+</code><code>"/dist"</code>
<code>},</code>
輸出的檔案結構如圖:
<a href="https://s2.51cto.com/wyfs02/M01/9A/2B/wKioL1lSNLngaSsFAAAJ42G4KKg366.png-wh_500x0-wm_3-wmp_4-s_1924461025.png" target="_blank"></a>
插件的屬性:
<code> </code><code>new htmlWebpackPlugin({</code>
<code> </code><code>filename:</code><code>"index-[hash].html"</code><code>,</code>
<code> </code><code>template:</code><code>'index.html'</code><code>,</code>
<code> </code><code>inject:</code><code>"head"</code><code>,</code>
<code> </code><code>title:</code><code>"我是title"</code><code>,</code>
<code> </code><code>date</code><code>:new Date(),</code>
<code> </code><code>})</code>
通過在plugins中定義的屬性和值,可以在頁面中用<%= %>模版引擎的方式展現出來。
eg:<%= htmlWebpackPlugin.options.title %>
并且可以取到值之後進行for循環
<code><% </code><code>for</code> <code>(var key </code><code>in</code> <code>htmlWebpackPlugin.files){ %></code>
<code><%= key %> : <%= JSON.stringify(htmlWebpackPlugin.files</code><code>[key]</code><code>) %></code>
<code><% } %></code>
通過周遊files和options可以看到插件對應的都有哪些屬性,這樣頁面中如果有多個js,一些想放到頭部,一些像放到body中,就可以直接在頁面中以模闆引擎的方式引入js了。
eg: <script type=”text/javascript src=”<%= htmlWebPackPlugin.files.chunks.main.entry %>”>
[此時inject要記得設為false]
多頁面配置:chunk:[]
plugin是一個數組,如果要打包成多個頁面,隻需寫多個建立插件對象的執行個體,給每個執行個體裡寫chunk屬性,該屬性是一個數組,每個數組裡對應的js的名稱。
excludeChunks:[] 除一些以外
安裝loader方法:
<code>npm </code><code>install</code> <code>xxx-loader --save-dev</code>
首先安裝html-loader:
<code>npm </code><code>install</code> <code>html-loader --save-dev</code>
在webopack.config.js中配置該loader
1. 首先寫好自己的html代碼,
<code><</code><code>div</code> <code>style</code><code>=</code><code>"background-color:red;width:100%;height:100%"</code><code>></code>
<code> </code><code><</code><code>h1</code><code>>模闆檔案處理 測試</</code><code>h1</code><code>></code>
<code></</code><code>div</code><code>></code>
<code>2. 然後再對應的js中import導入該html檔案,</code>
<code>import tpl from '../layer.html';</code>
<code>function layer() {</code>
<code> </code><code>return {</code>
<code> </code><code>name:'layer',</code>
<code> </code><code>tpl:tpl</code>
<code> </code><code>};</code>
<code>}</code>
<code>export </code><code>default</code> <code>layer;</code>
3. 然後去App.js中導入該js檔案,
4. 最後在App.js中渲染到index.html中
<code>import Layer from </code><code>'./layer.js'</code><code>;</code>
<code>const App = </code><code>function</code> <code>() {</code>
<code> </code><code>var</code> <code>dom = document.getElementById(</code><code>'app'</code><code>);</code>
<code> </code><code>var</code> <code>Layer = </code><code>new</code> <code>Layer();</code>
<code> </code><code>dom.innerHTML = Layer.tpl;</code>
<code>};</code>
<code>new</code> <code>App();</code>
有關html-loader的具體代碼,參見官網templating……
對于複雜的模闆引擎,安裝ejs-loader
字尾格式可以是.tpl/.ejs
當引入tpl的模闆檔案的時候,傳回的不是一個字元串,是一個function
webpack配置:
<code>{</code>
<code> </code><code>test:/\.ejs$/,</code>
<code> </code><code>loader:</code><code>'ejs-loader'</code>
<code> </code><code>},</code>
app.js
<code>import Layer from </code><code>'./src/js/layer.js'</code><code>;</code>
<code> </code><code>var</code> <code>layer = </code><code>new</code> <code>Layer();</code>
<code> </code><code>dom.innerHTML = layer.tpl({</code>
<code> </code><code>name:</code><code>'John'</code><code>,</code>
<code> </code><code>arr:[</code><code>"1111"</code><code>,</code><code>"2222"</code><code>,</code><code>"3333"</code><code>]</code>
<code> </code><code>});</code>
layer.tpl
<code><</code><code>div</code><code>></code>
<code> </code><code><</code><code>div</code><code>>this is <%= name %> layer</</code><code>div</code><code>></code>
<code> </code><code><% for (var i = 0;i < arr.length; i++) { %></code>
<code> </code><code><%= arr[i] %></code>
<code> </code><code><% } %></code>
[webpack 3.0 報錯]bundle.js:84 Uncaught TypeError: Cannot set property 'innerHTML' of null
處理圖檔及其他檔案的loader
file-loader
安裝loader
<code>npm </code><code>install</code> <code>file</code><code>-loader --save-dev</code>
webpack配置
<code> </code><code>test:/\.(png|jpg|gif|svg)$/,</code>
<code> </code><code>loader:</code><code>'file-loader'</code>
無論是在根目錄下的Index.html中直接引用(絕對路徑沒有問題,相對問題可以被解析),還是css中背景圖檔引用,亦或者是在模版檔案中引用,在file-loader的作用下,都成功被解析。在模版引擎檔案中,src可以以require(“相對路徑”) 的形式 引入,就可以成功引入,但是直接引用相對位址就不可以解析。
url-loader:
當圖檔小于指定大小的時候,使用url-loader,當大于指定大小的時候,自動轉換為file-loader
<code> </code><code>test:/\.(png|jpg|gif|svg)$/,</code>
<code> </code><code>loader:</code><code>'url-loader'</code><code>,</code>
<code> </code><code>query:{</code>
<code> </code><code>limit:20000, </code><code>//指定大小 ,機關kb</code>
<code> </code><code>name:</code><code>"src/[name]-[hash:5].[ext]"</code>
<code> </code><code>}</code>
image-webpack loader
圖檔壓縮loader
本文轉自 蓓蕾心晴 51CTO部落格,原文連結:http://blog.51cto.com/beileixinqing/1942489,如需轉載請自行聯系原作者