首先萬分感謝這個教程的製做者。少走了許多彎路,正在學習webpack的小夥伴能夠來看看,版本的坑暫時沒有!!!! 2017_7_6又加了一個很是有用的教程javascript
連接以下:webpack-react之webpack篇 --上
連接2以下: webpack+reactcss
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "webpack-dev-server --devtool eval-source-map --progress --content-base ./build", "build": "webpack" }
以後當啓動服務器以後咱們要在路徑中加上 localhost:xxxx/webpack-dev-server 其中xxxx爲端口號,可選範圍內隨意。以後咱們就能夠經過谷歌的調試插件看到局部更新的效果了。html
"webpack":"webpack --config webpack.config.js(這裏的名字想怎麼改就怎麼改) --progress --display --colors"
filename:'[name]-[chunkhash].js'
,根據教程,使用html-webpack-plugin來達成咱們的目的。const htmlWebpackPlugin=require('html-webpack-plusin');
,而後咱們在output後面加上plugins;[new htmlWebpackPlugin()]
,以後能夠發現咱們的插件已經生效,html已經生成了引用。不過在這個時候,它是自動生成的html文件.const path=require('path'); const htmlWebpackPlugin=require('html-webpack-plugin'); module.exports={ entry:'./src/script/main.js', output:{ // filename:'bundle.js', filename:'[name]-[chunkhash].js', path:path.resolve(__dirname,'./dist/js') }, plugins:[ new htmlWebpackPlugin({ template:'index.html' }) ] }
添加了template後的做用是,讓輸出的html以咱們template上下文中html爲藍本輸出index.htmljava
3.webpack中添加loader的方法有三種,一種是直接在require中添加,好比node
require('style-loader!css-loader!./style.css');
webpack --module-bind 'css=style!css'
這種方法是在命令行中添加module:{ loaders:[{ test:/\.js$/, loader:'babel-loader', query:{ presets:["es2015"] } }] }
另外,關於loader的串聯,咱們在require文件中只要寫"!"就行了,可是咱們在配置文件中的模塊中須要這樣寫react
{ test:/\.css$/, loader:["style-loader","css-loader"] }
注意,模塊名要寫全,不能直接寫style,否則報警了
另外還有其餘的寫法,下圖來自官方文檔==========》webpack
{ module: { loaders: [ { test: /\.jade$/, loader: "jade" }, // => "jade" loader is used for ".jade" files { test: /\.css$/, loader: "style!css" }, // => "style" and "css" loader is used for ".css" files // Alternative syntax: { test: /\.css$/, loaders: ["style", "css"] }, ] } }
4.關於webpack是如何出html模板文件的呢?主要仍是採用loader的機制。我經過下面幾張截圖來大概闡釋一下。同時我感受這跟Vue,React等有類似的地方。
---首先,這是index.html裏面的東西git
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> </div> </body> </html>
----這是app.js裏面的構建,其實就是將咱們的Layer掛載在div#app中github
import Layer from './components/layer/layer.js'; import './css/common.css'; const App=function(){ var dom=document.getElementById('#app'); var layer=new Layer() dom.innerHTML=layer.tpl; } new App();
-----這個是咱們所掛載的東西web
import tpl from './layer.html'; import './layer.less'; function layer(){ return { name:'layer', tpl:tpl } } export default layer;
---以後採用html-loader來讀取這個文件。直接用html-loader這種狀況是指不用任何模板的時候。
除此以外,還有使用其餘模板來編譯html的,好比說ejs,pug(jade)
下圖文件爲layer.tpl,固然,也能夠取名爲.ejs格式的,以後從js中import進去,用document.getElementById以後掛載上去
<div class="layer"> <div>this is <%= name %> layer</div> <% for (var i=0;i<arr.length;i++){ %> <%=arr[i]%> <% } %> </div>
在webpack的loader之中這樣寫
{ test:/\.tpl$/, loader:'ejs-loader' }
Babel相關
1.由於以前老是使用babel-core,babel-loader安裝,就會發現經常又少了東西.這個問題待更吧。
2.爲何babel打包的那麼慢呢?問題出在loader上,由於loader是很是耗時的東西。咱們能夠經過過濾掉一些不用編譯的文件來提升速度。其實主要就是用include和exclude來包含或者排除範圍。示範以下:
module:{ loaders:[{ test:/\.js$/, loader:'babel-loader', exclude:/node_modules/, query:{ presets:["es2015"] } }] }
!!可是問題來了,其實這樣的速度提高並不明顯,用include才能明顯地提高速度
module:{ loaders:[{ test:/\.js$/, loader:'babel-loader', exclude:/node_modules/, include:/src/, query:{ presets:["es2015"] } }] }
關於包含和排除的文件,也能夠調用path的resolve來實現,當咱們使用path.resolve(__dirname,'xx')的時候,咱們能夠發現,咱們的速度變得更快了。
var path=require('path'); // var htmlWebpackPlugin=require('html-webpack-plugin'); // console.log("如今的路徑是"+path.resolve(__dirname,'/the_last_webpack/app/')); //若是是 path.resolve(__dirname,'/app/'); //它會輸入 ==> E:/app module.exports={ entry:"./app/main.js", output:{ path:path.resolve(__dirname,'./build/'), filename:'bundle.js' }, module:{ loaders: [{ test:/\.html$/, loader:'html-loader' },{ test:/\.(js|jsx)$/, loader:"babel-loader", // exclude:path.resolve(__dirname,'/the_last_webpack/node_modules/'), exclude:/node_modules/, //個人上面和下面都是對的,再下方也是對的,可是,爲何path.resolve(__dirname,/app/)是錯的? // include:/app/, 這樣也是對的 include:path.resolve(__dirname,'app'), // include:path.resolve(__dirname,'/app/main.js'), query:{ presets:["react","es2015"] } }] } // plugins:[ // new htmlWebpackPlugin({ // filename:'index.html', // filename:'index.html' // }) // ] }