React.js學習筆記(20) ( ! Nodejs升級后npm全局安裝模塊出錯相關總結 ) + match,location,history + ( webpack-bundle-analyzer包分析插件 ) + ( npm常用命令匯總 ) + ( babel-preset-env )

(一) Nodejs升級后遇到的問題

  • Nodejs升級后,npm 安裝 cnpm報錯,全局安裝其他模塊也報錯
  • 解決以上報錯的方法:
    把npm全局安裝路徑和緩存設置成默認路徑,刪掉C:\Users\xxx\AppData\Roaming\npm路徑中的node_modules,然后從新安裝cnpm和全局安裝其他模塊
    ( C:/Users/用戶名/AppData里面默認有三個文件夾,分別是Local,LocalLow,Roaming,簡單地來說,都是用來存放軟件的配置文件和臨時文件的 )
  • 解決需要了解的知識點:
(1) 查看npm配置
npm config list  // 查看基本配置 (重要)

npm config list -l //查看所有配置
(2) 本地安裝 ( local )

npm install xxxx

(3) 全局安裝 ( global )

npm install -g xxxx
npm install --global xxxx
npm的默認全局安裝路徑為:"C:\Users\xxx\AppData\Roaming\npm" 這里的xxx這里的xxx就要看你是什么電腦品牌了

  • 設置全局安裝路徑
設置npm全局安裝路徑

npm config set prefix "目錄路徑"


// 例如
// npm config set prefix "C:\Users\MR X6TI\AppData\Roaming\npm"  -- 注意這里路徑一定要加引號
  • 查看全局安裝路徑
查看npm全局安裝路徑

npm config get prefix
(4) 緩存路徑 ( cache )

npm的默認全局安裝路徑為:"C:\Users\xxx\AppData\Roaming\npm-cache" 這里的xxx這里的xxx就要看你是什么電腦品牌了

  • 設置緩存路徑 cache
設置緩存路徑

npm config set cache "目錄路徑"


// 例如
npm config set cache "C:\Users\MR X6TI\AppData\Roaming\npm-cache"  設置緩存文件夾

// -- 注意這里路徑一定要加引號 
  • 查看緩存路徑 cache
查看緩存路徑 cache

npm config get cache
(5) npm bin

npm bin 命令顯示相對于當前目錄的,Node 模塊的可執行腳本所在的目錄(即 .bin 目錄)。

npm bin


運行結果:
C:\Users\MR X6TI\node_modules\.bin

(官網api) https://www.npmjs.com.cn/cli/cache/
(詳細) https://www.cnblogs.com/djlxs/p/5731955.html
(專欄) https://segmentfault.com/p/1210000009653830/read
https://www.cnblogs.com/mei1234/p/7606780.html













(一) npm常用命令匯總

  • 查看模塊的當前版本號
npm view 模塊名 version  ---------遠程倉庫中目前的版本號
 // 需要注意的是查看到的模塊版本是該模塊再遠程倉庫的版本號,并不是當前項目中所依賴的版本號。

 
npm list 模塊名 version  ---------當前項目中使用的版本號
 // 查看當前項目中應用的某個模塊的版本號的命令
  • 查看模塊的歷史版本
 npm view 模塊名 versions
  • 檢查包是否已經過時
 npm outdated

 // 此命令會列出所有已經過時的包,可以及時進行包的更新
 // outdated 是過時的意思
  • 更新node模塊
 npm update 模塊名

 // 當然你也可以update 該模塊到指定版本
 npm update 模塊名 @版本號  -----------指定版本


 // 如果安裝到最新版本可以使用以下命令
 npm install 模塊名@latest  -----------最新版本 
 

 // 如果當前的版本號為2.5.1,是沒辦法進行npm update 模塊名 @2.3.1 將模塊版本號變為2.3.1的,

 // 當然,你可以先uninstall,然后進行install @2.3.1

 // 或者直接覆蓋安裝
  • 卸載node模塊
 npm uninstall 模塊名


刪除本地模塊時你應該思考的問題:是否將在package.json上的相應依賴信息也消除?
npm uninstall 模塊:刪除模塊,但不刪除模塊留在package.json中的對應信息
npm uninstall 模塊 --save 刪除模塊,同時刪除模塊留在package.json中dependencies下的對應信息
npm uninstall 模塊 --save-dev 刪除模塊,同時刪除模塊留在package.json中devDependencies下的對應信息

  • 創建package.json文件
 npm init
  • 查看npm的版本
npm -v

(二) npm的版本控制

  • npm包的版本號的格式X.Y.Z
    X為主版本號,只有更新了不向下兼容的API時進行修改主版本號 ( ^ )
    Y為次版本號,當模塊增加了向下兼容的功能時進行修改 ( 波浪號 )
    Z為修訂版本號,當模塊進行了向下兼容的bug修改后進行修改
    1.修復bug,小改動,增加z
    2.增加了新特性,但仍能向后兼容,增加y
    3.有很大的改動,無法向后兼容,增加x
  • NPM依賴包版本號~和^和*的區別
版本號 X.Y.Z

脫字符(^)來限定所安裝模塊的主版本號
波浪號(~)是限定所安裝模塊的次要版本
星號  (*) 最新版本

------------------------------------

~ 會匹配最近的小版本依賴包,比如~1.2.3會匹配所有1.2.x版本,但是不包括1.3.0
^ 會匹配最新的大版本依賴包,比如^1.2.3會匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0
* 這意味著安裝最新版本的依賴包


推薦使用~,只會修復版本的bug,比較穩定

使用^ ,有的小版本更新后會引入新的問題導致項目不穩定,
比如:之前的weex老項目安裝依賴后頁面無法顯示,修改依賴版本后才正常

使用*, 同樣有上述問題
  • npm安裝指定版本
npm install 模塊名@版本號 

例如:cnpm install webpack@4.0.0 -D

https://www.cnblogs.com/penghuwan/p/6973702.html
https://www.cnblogs.com/blackgan/p/7828047.html

(三) match對象

(1) match 對象包含了 <Route path> 如何與 URL 匹配的信息,match對象中包含了以下參數:

  • path
這里的path,是 <Route path="/chat/:user" component={xxx} /> 中的path

即  path = '/chat/:user

在需要嵌套<Route/>的時候用到------ <Route path="path"  />
  • url
url是當前的url地址

比如:url:"/chat/5a885a36867c9c4570d8de66"

在需要使用<Link/>的時候會用到------<Link  to="url"/>
  • params
通過解析URL中動態的部分獲得的鍵值對都被包含在這個對象中

比如:params:{user: "5a885a36867c9c4570d8de66"}
  • isExact
path 是否等于 pathname,當為true時,整個URL都需要匹配

比如:isExact:true
  • 當一個 Route 沒有 path 時,它會匹配一切路徑。一般404頁面就用該方法。( 在有<Switch>標簽,并且有Router沒有path時,只要Switch中其他路由都沒有命中,其他的地址都會帶有沒有path的Route

ReactDOM.render(
    <Provider store={store}>
        <BrowserRouter>
            <div>
                <AuthRoute></AuthRoute>
                <Switch>
                    <Route path="/bossinfo" component={BossInfo}></Route> 
                    <Route path="/geniusinfo" component={GeniusInfo}></Route>
                    <Route path='/register' component={Register}></Route> 
                    <Route path='/login' component={Login}></Route>
                    <Route path='/chat/:user' component={Chat}></Route>
                    <Route component={Dashboard}></Route> 
                    // 只要其他路由未命中,都會加載Dashboard路由組件
                </Switch>
            </div>
        </BrowserRouter>
    </Provider>
, document.getElementById('root'));
registerServiceWorker();

(2) this.props.match

  • 只要是路由組件,就可以在組件內部通過 this.props.match獲得以上數據
  • 非路由組件,需要使用withRouter (match, history, location非路由組件都需要使用withRouter,通過this.props獲得相關數據)
  • 對于history,除了用withRouter外,還可以用這幾種方式去跳轉路由-------如何使用history跳轉路由(全):https://segmentfault.com/a/1190000011137828
withRouter


import {withRouter} from 'react-router-dom';

class authRoute extends React.Component {
 ...
}

export default withRouter(authRoute)

(四) location對象

(1) location對象中包含了以下參數:

  • hash:設置或返回從井號 (#) 開始的 URL(錨)。

  • search:設置或返回從問號 (?) 開始的 URL(查詢部分)。

  • pathname:設置或返回當前 URL 的路徑部分(路徑部分)。

  • state:一個捆綁在這個地址上的object對象

  • key:唯一ID

  • - href:設置或返回完整的 URL。

  • - host:設置或返回主機名和當前 URL 的端口號。

  • - hostname:設置或返回當前 URL 的主機名。

  • - port:設置或返回當前 URL 的端口號。

  • - protocol:設置或返回當前 URL 的協議

    location對象

(2) location 對象不會發生改變,因此可以在生命周期的回調函數中使用 location 對象來查看當前頁面的訪問地址是否發生改變。這種技巧在獲取遠程數據以及使用動畫時非常有用


componentWillReceiveProps(nextProps) {
  if (nextProps.location !== this.props.location) {
    // navigated!
  }
}

(五) history對象

(1) history對象中包含了以下參數:

  • location對象----history對象中有location對象,可變
  • go
  • goBack 返回-1
  • goForward 向前+1
  • push(location) 跳轉到需要的路由,將新條目推入歷史堆棧
  • replace(location) 替換歷史堆棧上的當前條目
  • length 歷史堆棧中的條目數量
  • action 當前動作(PUSH,REPLACE,或POP)

(2) history是可變的,因此請使用location對象獲取地址,而不是history.location中獲取地址

https://zhuanlan.zhihu.com/p/20799258?refer=jscss

(六) webpack-bundle-analyzer 包分析工具

  • 安裝
cnpm install webpack-bundle-analyzer --save-dev
  • 使用:
在webpack.config.dev.js中


const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
  plugins: [
    new BundleAnalyzerPlugin()
  ]
}


使用 Webpack 編譯之后,可視化的結果會被展示在http://localhost:8888/

webpack打包優化:https://segmentfault.com/a/1190000011138081
基于 Webpack 的應用包體尺寸優化:https://segmentfault.com/a/1190000008151173

(七) babel-preset-env

  • 替換之前所有babel-presets-es20xx插件
  • 當安裝babel-preset-ws2015的時候,會提示安裝babel-preset-env
  • 使用:

1.在babel配置文件中
{
"presets": ["env", "react", ...]
}
上面這個配置的作用和babel-prset-latest的作用一致也就是下面這個配置
{
"presets": ["latest"]
}



2.babel-preset-env可以設置一些選項,比如:
targets 指定運行環境
targets.node 指定node版本
targets.browsers 指定瀏覽器版本
modules 指定何種形式的模塊,設置為false表示不轉碼模塊



具體配置書寫方式如下
{
"presets": [
    ["env",{
        "targets": {
            "chrome": 52,
            "browsers": ["last 2 versions","safari 7"]
        }
    }]
]
}

https://segmentfault.com/a/1190000010468759

https://segmentfault.com/a/1190000010657339#articleHeader7
https://segmentfault.com/a/1190000010174260

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容