webpack的使用及過程中遇到的問題和解決辦法

寫在前面的話:以下內容會結合實例進行分析webpack安裝與使用過程中遇到的問題及解決方法

1、webpack安裝
webpack可以使用npm進行安裝,首先在任意磁盤下新建一個文件夾(我的建立在E盤)webpack-demo,請執行以下操作步驟:
(1)E: //轉到E盤
(2)cd webpack-demo //轉到webpack-demo文件夾
(3)npm init //通過這個命令可以自動創建一個package.json文件,這是一個標準的npm說明文件,里面包含當前項目的依賴模塊,自定義的腳本任務等等
(4-1)npm install webpack -g //全局安裝,或是
(4-2)npm install webpack --save-dev //本地安裝
(5)在webpack-demo文件夾下新建app和dist兩個文件夾,其中app文件夾用于存放原始數據和JS模塊,dist文件夾存放之后供瀏覽器讀取的文件,一般是index.html文件(包括使用webpack打包生成的js文件)
(6)在app文件夾下新建sayHello.js和main.js文件,在dist文件夾下新建index.html和main.js文件(由于webpack4之后在打包時會生成dist文件夾和main.js文件,因此這里需要創建,不然會報錯)

2、不需任何配置使用webpack
webpack打包語法為:webpack {entry file} {output file},其中entry file代表入口文件的路徑,也就是上面的app/main.js文件,output file代表打包后的文件存放路徑,也就是上面的dist/main.js,然后執行以下命令:
(1-1)webpack app/main.js dist/main.js //全局安裝webpack的使用此條命令

注意:經過本人實際測試發現,執行上述命令時會報錯,根據實際的報錯原因是需要安裝webpack-cli,這是因為webpack4已將webpack命令行相關內容都遷移到了webpack-cli中,所以除了安裝webpack之外還需要安裝webpack-cli

(1-2)node_modules/.bin/webpack app/main.js dist/main.js //本地安裝webpack的使用此條命令
(2)打開index.html文件即可查看輸出內容

3、通過webpack.consig.js配置文件來使用webpack
正如上面第2步中看到的,當我們執行webpack打包命令時需要輸入一長串的內容,這是非常不方便的,而且也很容易出錯,那么怎么才能方便一點呢,就是通過webpack.config.js文件來實現,執行以下操作步驟:
(1)在webpack-demo文件夾下新建webpack.config.js文件并加入如下代碼:
module.exports = {
??entry: __dirname + "/app/main.js",//唯一的入口文件,其__dirname是當前執行腳本所在的目錄
??output: {
????path: __dirname + "/dist",//打包后的文件存放路徑
????filename: "main.js"http://打包后輸出文件的文件名
??}
}
(2-1)webpack //全局安裝的執行這條命令,此命令會自動引用webpack.config.js文件中的配置選項
(2-2)node_modules/.bin/webpack //本地安裝的執行這條命令

可以看出相比之前第2步(正式使用webpack)中的命令簡單的很多

4、通過package.json文件使用webpack
正如上面第3步中看到的,我們在執行webpack打包命令時還是需要輸入像webpack(或是node_modules/.bin/webpack)這樣的命令,感覺還是很繁瑣,怎么辦呢,就是通過package.json實現,請執行以下操作步驟:
(1)在package.json文件中對scripts對象進行設置,代碼如下:
"scripts": {
??"test": "echo \"Error: no test specified\" && exit 1",
??"start": "webpack",
},
(2)npm start //package.json中的script會安裝一定順序尋找命令對應位置,本地的node_modules/.bin路徑就在這個尋找清單中,所以無論是全局還是局部安裝的webpack,你都不需要寫前面那指明詳細的路徑了。

注意:在package.json文件的scripts對象中添加完"start":"webpack"之后執行npm start會報錯誤,也是類似上文已經提到的需要安裝webbpack-cli,但是我們在上文報錯時已經安裝了webpack-cli,然而需要意識到我們在上文只是在全局安裝了webpack-cli,而沒有在本地安裝,因此在這里需要進行本地安裝webpack-cli,經過我實際測試,這樣做之后就不會再報錯了。但是,問題又來了,此時會有一個警告,大概意思是說'mode'沒有定義,這是 webpack 4x 引入的,有兩個值,development 和 production。默認是production。怎么解決呢?我們只需修改一下"start":"webpack"為"start":"webpack --config webpack.config.js --mode development"即可,其中--config webpack.config.js可以不寫,默認就是它,此時再次運行npm start那命令行真的是干干凈凈,一個錯誤和警告都沒有了!

5、webpack功能——Source Maps
我們在開發的過程中總是要調試代碼,方便的調試能極大的提高開發效率,不過有時候通過打包后的文件,你是不容易找到出錯了的地方,對應的你寫的代碼的位置的,Source Maps就是來幫我們解決這個問題的。通過簡單的配置,webpack就可以在打包時為我們生成的source maps,這為我們提供了一種對應編譯文件和源文件的方法,使得編譯后的代碼可讀性更高,也更容易調試。在webpack的配置文件中配置source maps,需要配置devtool,它有以下四種不同的配置選項,各具優缺點,描述如下:

source maps配置

正如上表所述,上述選項由上到下打包速度越來越快,不過同時也具有越來越多的負面作用,較快的打包速度的后果就是對打包后的文件的的執行有一定影響。對小到中型的項目中,eval-source-map是一個很好的選項,再次強調你只應該開發階段使用它,cheap-module-eval-source-map方法構建速度更快,但是不利于調試,推薦在大型項目考慮時間成本時使用。我們繼續對上文新建的webpack.config.js,進行如下配置:
module.exports = {
??devtool: 'eval-source-map',
}

6、webpack功能——構建本地服務器
我們在平時調試代碼時總是修改之后要去刷新頁面,那在webpack中我們可以通過構建本地服務器來實現自動刷新顯示修改后的結果,webpack提供一個可選的本地開發服務器,這個本地服務器基于node.js構建,可以實現你想要的這些功能,不過它是一個單獨的組件,在webpack中進行配置之前需要單獨安裝它作為項目依賴,請執行以下操作步驟:
(1)npm install webpack-dev-server --save-dev
(2)devserver作為webpack配置選項中的一項,需要添加以下代碼到webpack.config.js中
module.exports = {
??devServer: {
????contentBase: "./dist",//本地服務器所加載的頁面所在的目錄,要注意這里的./中的.千萬不能丟失,否則啟動服務器之后頁面會輸出Cannot GET /的錯誤
????historyApiFallback: true,//在開發單頁應用時非常有用,它依賴于HTML5 history API,如果設置為true,所有的跳轉將指向index.html(即:不跳轉)
????inline: true,//設置為true,當源文件改變時會自動刷新頁面
????port: 8080//設置默認監聽端口,如果省略,默認為"8080"
??}
}
(3)添加以下命令到package.json文件中:
"scripts": {
??"server": "webpack-dev-server --open --mode development"
}
(4)啟動服務器:npm run server,啟動之后會自動打開瀏覽器頁面localhost:8080

注意:可能已經發現一些與上文不一樣的東西了,什么呢?那就是為什么上文中我們配置完"start":"webpack"之后,我們在運行時輸入的是npm start,而現在配置完"server":"..."之后運行的是npm run server,這其中多了一個run,這是因為npm的start命令是一個特殊的腳本名稱,其特殊性表現在,在命令行中使用npm start就可以執行其對于的命令,如果對應的此腳本名稱不是start,想要在命令行中運行時,需要這樣用npm run {script name}如npm run server

7、webpack功能——loaders
Loaders是webpack提供的最激動人心的功能之一了。通過使用不同的loader,webpack有能力調用外部的腳本或工具,實現對不同格式的文件的處理,比如說分析轉換scss為css,或者把下一代的JS文件(ES6,ES7)轉換為現代瀏覽器兼容的JS文件,對React的開發而言,合適的Loaders可以把React的中用到的JSX文件轉換為JS文件。Loaders需要單獨安裝并且需要在webpack.config.js中的modules關鍵字下進行配置。由于在編寫程序的過程中我們會涉及到使用ES6、ES7、React等的情況,因此我在操作過程中會安裝babel,其實babel是一個兒編譯JavaScript的平臺,它可以讓你能使用最新的JavaScript代碼(ES6,ES7...),而不用管新標準是否被當前使用的瀏覽器完全支持;讓你能使用基于JavaScript進行了拓展的語言,比如React的JSX。請執行以下操作步驟:
(1)安裝babel:npm install babel-core babel-loader babel-preset-env babel-preset-react --save-dev //其中babel-core是核心功能,babel-preset-env用來解析ES6,babel-preset-react用來解析JSX語法,并且在一次性安裝多個依賴模塊時,模塊之間用空格隔開
(2-1)配置babel:在webpack.config.js文件中加入以下代碼:
module.exports = {
??module: {
????rules: [
??????{
????????test: /(\.jsx|\.js)$/,//一個用以匹配loaders所處理文件的拓展名的正則表達式(必須)
????????use: {
??????????loader: "babel-loader",//loader的名稱(必須)
??????????options: {
????????????presets: [
??????????????"env", "react"
????????????]
??????????}
????????},
????????exclude: /node_modules/ //include/exclude:手動添加必須處理的文件(文件夾)或屏蔽不需要處理的文件(文件夾)(可選);
??????}
????]
??}
}
(2-2)babel可以在webpack.config.js中進行配置,但是由于babel有很多配置項會導致webpack.config.js文件顯得很臃腫,因此一般會把babel的配置項(options)單獨放在一個名字為".babelrc"的配置文件中,配置完成后webpack會自動調用.babelrc文件里的babelrc配置選項

執行完上邊步驟(2)之后我們就可以使用ES6和JSX語法來編寫程序了,但是如果我們想使用React(JSX只是編寫React的一種方式)編寫程序還需要安裝react和react-dom

(3)npm install react react-dom --save-dev

8、webpack功能——CSS
webpack中有兩個處理樣式表的工具:css-loader和style-loader,二者處理的任務不同,css-loader使你能夠使用類似@import 和 url(...)的方法實現 require()的功能;style-loader將所有的計算后的樣式加入頁面中,二者組合在一起使你能夠把樣式表嵌入webpack打包后的JS文件中。請執行以下操作步驟:
(1)npm install css-loader style-loader --save-dev
(2)在webpach.config.js中配置,代碼如下:
module.exports = {
??module: {
????rules: [
??????{
????????test: /\.css$/,
????????use: [
??????????{
????????????loader: "style-loader"
??????????}, {
????????????loader: "css-loader"
??????????}
????????]
??????}
????]
??}
}

9、webpack功能——CSS預處理器
Sass、Less之類的預處理器是對CSS的擴展,允許使用類似于變量的不存在與原生CSS中的特性來寫CSS,CSS預處理器可以這些特殊類型的語句轉化為瀏覽器可識別的CSS語句,其實存在一個CSS處理平臺-PostCSS,幫助CSS實現更多的功能,請執行以下操作步驟:
(1)npm install postcss-loader autoprefixer --save-dev //autoprefixer是自動添加前綴的插件
(2)在webpack.config.js中添加postcss-loader,代碼如下:
module.exports = {
??module: {
????rules: [
??????{
????????test: /\.css$/,
????????use: [
??????????{
????????????loader: "postcss-loader"
??????????}
????????]
??????}
????]
??}
}
(3)在根目錄新建postcss.config.js并添加如下代碼:
module.exports = {
??plugins: [
????require('autoprefixer')
??]
}
(4)npm start //你寫的css會自動添加不同前綴了

10、webpack功能——插件(Plugins)
插件(Plugins)是用來拓展Webpack功能的,它們會在整個構建過程中生效,執行相關的任務。與loaders的區別在于loaders是在打包構建過程中用來處理源文件的(JSX,Scss,Less..),一次處理一個,插件(Plugins)并不直接操作單個文件,它直接對整個構建過程其作用。

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