摘要:安裝寫在里安裝和配置和之前一樣用來處理文件相關的這個包括的就比較多,有,后面兩個是為了寫和服務。
這兩天學習了一些webpack的知識,loaders+plugins真的很強大!不過配置起來也很復雜,看了一些文章,自己也寫了項目練手,寫下來加深自己的印象。
首先,非常非常推薦的幾篇文章,初學者一定要看!
<入門Webpack,看這篇就夠了>
http://www.jianshu.com/p/42e1...
(標題一點也不夸張,非常適合0基礎)
https://zhuanlan.zhihu.com/p/...
https://zhuanlan.zhihu.com/p/...
https://zhuanlan.zhihu.com/p/...
(這個系列有三篇文章,第三章是一個webpack+react的小項目,跟著做一遍會很有收獲~)
另外,也推薦看一下阮一峰es6書中module這一章,弄清楚export/import/export default等等命令,畢竟webpack的各個模塊是靠export/import/require(commonjs)鏈接起來的,所以這些都要掌握。
具體到項目的話,webpack有幾個比較基本的概念:
1、loaders:通過不同的loaders,webpack可以處理各式各樣的文件,然后打包到一個文件中(比如bundle.js);
2、plugins:plugins是為了拓展webpack的功能的,和loaders不同的是,loader是用來處理單個文件的(比如json-loader處理.json,sass-loader處理.scss),但是plugins是直接對整個構建過程進行處理(比如自動生成html文件的html-webpack-plugin);
3、others: 這些我也不知道要歸到哪里去,但是在配置中也是必不可少,包括webpack-dev-server/source-map等等,后面會具體說;
4、配置文件:我這個小項目包括的文件有.babelrc(用來處理babel),webpack.config.js(webpack項目基礎配置文件),package.json(這個文件會記錄所有的devDependencies)。
然后我們就一項一項來分析吧:
1、loaders這幾個loader用來處理.css和.scss文件,一起安裝用空格隔開:
$ npm install --save-dev style-loader css-loader sass-loader
同時修改webpack.config.js:
module: { loaders: [ { test: /.scss$/, //loaders是依靠正則表達式來測試這個文件是不是這個loader來處理,所以test不能少 loaders: ["style-loader","css-loader","sass-loader"], //"-loader"一定要寫,不然會報錯 //loaders的處理順序是從右向左,就是會先用sass-loader,其次css-loader,再次style-loader }
這個loader是用來處理url鏈接,就是圖片或者其他靜態文件。
安裝:
$ npm install --save-dev url-loader
webpack.config.js (寫在module里):
{ test: /.(png|jpq)$/, loader: "url? limit = 40000" }
安裝和配置和之前一樣~用來處理json文件
這個包括的就比較多,有babel-core/babel-loader/babel-preset-es2015/babel-preset-react,后面兩個是為了寫es6和react服務。
//webpack.config.js { test: /.jsx$/, loader:"babel-loader", include: APP_PATH, //這個include是說只對這里面的文件負責,還有一個對應的exclude,就是忽略范圍內的文件, 比如:exclude: "./node_modules/"; }
另外因為babel需要寫的選項比較多,可以配一個.babelrc在根目錄下:
//.babelrc { "presets":["react","es2015"], } }
以上就是用的比較多的loaders,配完這些webpack就可以處理json/sass/es6啦~
2、plugins這個插件的作用就是自動生成html(其實也可以自己寫,就是加了個bundle.js的script而已,不過感覺比較酷):
plugins安裝好了之后要放在webpack.config.js的plugins的數組里,不要寫在modules里呀~
//webpack.config.js plugins: [ new HtmlWebpackPlugin({ //在最前面先定義下HtmlWebpackPlugin-- //var HtmlWebpackPlugin = require("html-webpack-plugin"); title: "searchBar", //配合html-webpack-plugin的配置 }) ],
HMR是一個webpack插件,它讓你能瀏覽器中實時觀察模塊修改后的效果,但是如果你想讓它工作,需要對模塊進行額外的配額;
Babel有一個叫做react-transform-hrm的插件,可以在不對React模塊進行額外的配置的前提下讓HMR正常工作;
安裝:
$ npm install --save-dev babel-plugin-react-transform react-transform-hmr
配置:
//webpack.config.js (plugins里) new webpack.HotModuleReplacementPlugin();
然后修改下.babelrc:
{ "presets": ["react", "es2015"], "env": { "development": { "plugins": [["react-transform", { "transforms": [{ "transform": "react-transform-hmr", "imports": ["react"], "locals": ["module"] }] }]] } } }
這樣在使用react的時候就可以熱加載模塊了~
壓縮JS代碼;
分離CSS和JS文件;
以上兩個插件這次沒有用,先記下來下次用過了再來補~
用來構建本地開發的服務器,可以讓瀏覽器監測代碼的修改,并自動刷新修改后的結果;
安裝:
$npm --save-dev webpack-dev-server
webpack-dev-server有以下幾個配置選項:
contentBase:默認webpack-dev-server會為根文件夾提供本地服務器,如果想為另外一個目錄下的文件提供本地服務器,應該在這里設置其所在目錄(本例設置到“public"目錄)
port:設置默認監聽端口,如果省略,默認為”8080“
inline:設置為true,當源文件改變時會自動刷新頁面
historyApiFallback:在開發單頁應用時非常有用,它依賴于HTML5 history API,如果設置為true,所有的跳轉將指向index.html
//webpack.config.js devServer: { contentBase: "./public",//本地服務器所加載的頁面所在的目錄 historyApiFallback: true,//不跳轉 inline: true//實時刷新 }
//package.json "scripts": { "start": "webpack-dev-server --inline", }
然后就可以用http://localhost:8080/index.html預覽項目啦~
source maps提供了一種對應編譯文件和源文件的方法,使得編譯后的代碼可讀性更高,也更容易調試。
在學習階段和寫中、小型項目的時候,用eval-source-map,如果是開發大型項目可以用cheap-module-eval-source-map,會更快。
//webpack.config.js devtool: "eval-source-map",
這個就包括一些我們比較了解的比如react/react-dom/jquery/moment/bootstrap等等啦,配置起來也很方便,首先是安裝:
$npm --save-dev jquery moment react react-dom $npm install bootstrap@4.0.0-alpha.2 --save-dev
然后在你需要的js文件里引用這些庫:
import React from "react"; import ReactDOM from "react-dom"; var $ = require("jquery"); var moment = require("moment");
然后就可以愉快地寫各種js、jsx文件啦~
4、配置文件最后我們來講一講幾個配置文件的問題:
上面提到的都是各種肢解,我這次的config文件是這樣的:
var path = require("path"); var HtmlWebpackPlugin = require("html-webpack-plugin"); var ROOT_PATH = path.resolve(__dirname); var APP_PATH = path.resolve(ROOT_PATH, "app"); var BUILD_PATH = path.resolve(ROOT_PATH, "build"); module.exports = { devtool: "eval-source-map", entry: __dirname + "/app/index.jsx", //webpack的入口文件只有一個,所以寫的所有components甚至包括css/json什么的,都要引用在這里 output:{ path: __dirname +"/public", filename: "bundle.js", }, //我這邊是新建了一個folder叫public,用來放index.html和bundle.js devServer: { contentBase: "./public",//本地服務器所加載的頁面所在的目錄 historyApiFallback: true,//不跳轉 inline: true//實時刷新 }, plugins: [ new HtmlWebpackPlugin({ title: "searchBar", //配合html-webpack-plugin的配置 }) ], module: { loaders: [ { test: /.scss$/, loaders: ["style-loader","css-loader","sass-loader"], },{ test: /.(png|jpq)$/, loader: "url? limit = 40000" },{ test: /.jsx$/, loader:"babel-loader", include: APP_PATH, }] }, resolve:{ extensions: ["",".js", ".jsx"] }, };
這個文件會在你最開始npm init的時候就生成,一路回車就可以,后來都可以改~
{ "name": "serach-bar", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "dev": "webpack-dev-server --progress --profile --colors --hot", "build": "webpack --progress --profile --colors", "test": "karma start" }, //scripts這邊可以改一下,改start可以,在終端用npm start,上面有例子~這邊的dev要改的話在終端的命令是"npm run dev; "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.22.1", "babel-loader": "^6.2.10", "babel-plugin-react-transform": "^2.0.2", "babel-preset-es2015": "^6.22.0", "babel-preset-react": "^6.22.0", "babel-preset-react-hmre": "^1.1.1", "bootstrap": "^4.0.0-alpha.2", "css-loader": "^0.26.1", "file-loader": "^0.10.0", "html-webpack-plugin": "^2.28.0", "jquery": "^3.1.1", "jshint": "^2.9.4", "jshint-loader": "^0.8.3", "json-loader": "^0.5.4", "node-sass": "^4.5.0", "react": "^15.4.2", "react-dom": "^15.4.2", "react-transform-catch-errors": "^1.0.2", "react-transform-hmr": "^1.0.4", "redbox-react": "^1.3.3", "sass-loader": "^4.1.1", "style-loader": "^0.13.1", "url-loader": "^0.5.7", "webpack": "^2.2.1", "webpack-dev-server": "^2.3.0" } }
裝了很多dev,其實用不著那么多哈哈~
{ "presets":["react","es2015"], "env":{ "development":{ "presets":["react-hmre"] } } }
ok,這樣就差不多啦~另外還要注意的是index.jsx/index.js,所有的components都要引用過來,css/scss也是,css文件的話最好有一個main.css進行整合,這樣不會漏掉。
看一眼這次的index.jsx:
// "注意這些import import "../node_modules/bootstrap/scss/bootstrap.scss"; import "./main.scss"; import React from "react"; import ReactDOM from "react-dom"; import Search from "./components/search"; import Plist from "./components/plist"; class App extends React.Component{ constructor(props){ super(props); this.state={"keyword":""}; this.refreshKeyword = this.refreshKeyword.bind(this); } refreshKeyword(name){ this.setState({"keyword":name}); } render(){ return () } }; const app = document.createElement("div"); document.body.appendChild(app); ReactDOM.render(Search Github Users
, app);
恩,差不多就是這樣啦~~項目初始化的時候不要忘記npm install --save-dev webpack哦!coding愉快!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81403.html
摘要:前段時間又發布了新版本我接觸的時候已經版本了支持的版本必須打包速度大小比較以及粗淺的試了一下下圖所示,黃色為版本綠色為我寫的配置,跟基本相似,具體不同下面會介紹藍色是自帶的模式紅色為具體大小速度大家可以比較一下,還是很給力的關于配置方面,應 前段時間webpack又發布了新版本webpack4我接觸的時候已經4.1版本了node支持的版本必須node: >=6.11.5 webpack...
摘要:確保在和環境下,如果沒有,先安裝環境。我的新建一個文件夾,在命令行里進入執行此時,文件夾下多了一個文件。本文僅獻給初學的同學,功能強大,想要學好仍需多多學習。 1、確保在node和npm環境下,如果沒有,先安裝node環境。我的node: showImg(https://segmentfault.com/img/bVbu1T2); 2、新建一個文件夾web,在命令行里進入web,執行 ...
摘要:結合編輯器可以推導變量對應的類型以及內部的結構,提高代碼的健壯性和可維護性。通過充分利用時間回溯的特征,可以增強業務的可預測性與錯誤定位能力。對于對象的哪部分需要成為可觀察的,提供了細粒度的控制。 showImg(https://segmentfault.com/img/bVba6Ts?w=1218&h=525); 為什么要使用TypeScript 偵測錯誤 通過靜態類型檢測可以盡早檢...
摘要:當然,我們需要先下載配置下載和配置下載下載的加載器下載完了,要去進行配置,配置完的文件如下可以看到,和之前的相比,增加了一個的配置。 準備 下載Node.js和npm 一個命令行工具(我的是git bash)。不是必須的,用自帶的命令行也可以。 創建一個文件夾,作為根目錄,比如 npm-webpack-es6 這時,你將看到一個空文件夾 開始 命令行打開至根目錄 鍵入 npm i...
摘要:有沒有辦法實現就局部刷新呢當然是有第十步執行為了實現局部熱加載,我們需要添加插件。 前言 用了3個多月的vue自認為已經是一名合格的vue框架api搬運工,對于vue的api使用到達了一定瓶頸,無奈水平有限,每每深入底層觀賞源碼時候都迷失了自己。 遂決定再找個框架學習學習看看能否突破思維局限,加上本人早已對React、RN技術垂涎已久,于是決定找找教程來學習。無奈第一步就卡在了環境搭...
閱讀 3768·2021-11-24 09:39
閱讀 2969·2021-11-16 11:49
閱讀 2087·2019-08-30 13:54
閱讀 1111·2019-08-30 13:03
閱讀 1102·2019-08-30 11:10
閱讀 729·2019-08-29 17:10
閱讀 1256·2019-08-29 15:04
閱讀 1224·2019-08-29 13:02