您好,登錄后才能下訂單哦!
這篇文章主要介紹了webpack2.0如何搭建前端項目,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
一、什么是webpack:
webpack可以看做是模塊打包機:它做的事情是,分析你的項目結構,找到JavaScript模塊以及其它的一些瀏覽器不能直接運行的拓展語言(Scss,TypeScript等),并將其打包為合適的格式以供瀏覽器使用。
注意: 目前最新為webpack2.0版本,與1.0有一些出入
二、初始化項目
npm init npm install webpack --save-dev
三、安裝loader,stylus以及postCss
npm install style-loader css-loader stylus-loader stylus --save-dev npm install --save-dev postcss-loader autoprefixer
四、目錄結構大致如下
五、添加webpack.config.js 配置如下:
// 該配置基于webpack2.0 詳情查看 https://webpack.js.org/guides/migrating/ const path = require('path'); // 導入路徑包 module.exports = { entry: './src/main.js', //入口文件 output: { path: path.resolve(__dirname, 'build'), // 指定打包之后的文件夾 // publicPath: '/assets/', // 指定資源文件引用的目錄,也就是說用/assests/這個路徑指代path,開啟這個配置的話,index.html中應該要引用的路徑全部改為'/assets/...' // filename: 'bundle.js' // 指定打包為一個文件 bundle.js filename: '[name].js' // 可以打包為多個文件 }, // 使用loader模塊 module: { /* 在webpack2.0版本已經將 module.loaders 改為 module.rules 為了兼容性考慮以前的聲明方法任然可用, 同時鏈式loader(用!連接)只適用于module.loader, 同時-loader不可省略 */ rules: [{ test: /\.css$/, use: [ 'style-loader', { loader: 'css-loader', options: { // modules: true // 設置css模塊化,詳情參考https://github.com/css-modules/css-modules } }, { loader: 'postcss-loader', // 在這里進行配置,也可以在postcss.config.js中進行配置,詳情參考https://github.com/postcss/postcss-loader options: { plugins: function() { return [ require('autoprefixer') ]; } } } ] }, { test: /\.styl(us)?$/, use: [ 'style-loader', 'css-loader', { loader: "postcss-loader", options: { plugins: function() { return [ require('autoprefixer') ]; } } }, 'stylus-loader' ] }] } }
在index.html中引入'/build/main.js'。main.js 代碼如下
require('./common/css/style.css'); require('./common/css/stylus.styl');
六、通過webpack-dev-server實現頁面的自動刷新。
首先安裝webpack-dev-server
npm install --save-dev webpack-dev-server
然后修改package.json配置文件中:
"scripts": { "start": "webpack-dev-server", "build": "webpack" }
使用npm start
啟動服務。npm的 start是一個特殊的腳本名稱,它的特殊性表現在,在命令行中使用npm start
就可以執行相關命令,如果對應的此腳本名稱不是start,想要在命令行中運行時,需要這樣用npm run {script name}
,所以打包命令修改為npm run build
。
這里如果使用webpack-dev-server
命令來啟動就必須全局安裝 devServer:
npm install webpack-dev-server -g
在webpack的配置文件中可以對devServer進行配置
// 配置devServer各種參數 devServer: { contentBase: "./", // 本地服務器所加載的頁面所在的目錄 historyApiFallback: true, // 不跳轉 inline: true // 實時刷新 }
此時可以監聽入口文件的改變,實時刷新頁面,然而非入口文件的改變則不會被監聽到,需要手動進行刷新。并且目標文件不包括index.html。這里使用html-webpack-plugin插件。
npm install html-webpack-plugin --save-dev
修改webpack配置文件,添加以下配置:
... const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { ...., plugins: [ new HtmlWebpackPlugin({ template: './index.html' // 模版文件 }) ] }
這里記錄一下遇到的坑:首先,devServer其實讀取的是打包之后的文件,但是這些文件是存儲在內存當中(并不會顯示在build下)。然后由于使用HtmlWebpackPlugin這個插件,它可以自動幫你將打包的js插入模版html文件中,因此我們要將原文件(就是作為模版的index.html文件)中插入的main.js這行代碼去掉。然后如果開啟了publicPath這個選項,HtmlWebpackPlugin會插入publicPth選項的路徑('/assets/main.js'),devServer的index.html此時是無法讀取到該目錄下的文件。但是奇怪的是devServer此時直接沒有插入該scripts。。不知道為啥。。但是為了部署的問題,cdn啥的,對開發環境和生產環境應該開啟不同的publicPath,也就是說開發和生產應該使用兩個不同的配置文件(包括sourcemap,devserver都不應該出現在生產的配置中)。
七、sourcemap 讓開發更易于調試
module.exports = { devtool: 'eval-source-map',//配置生成Source Maps,選擇合適的選項 .... } }
八、使用ES6語法
webpack2.0增加了對ES6模塊的支持,無需額外的配置,并且可以與 AMD 和 CommonJS混用。webpack 2可以分析理解所有的ES6代碼并且只在檢測到是ES6模塊時才使用tree-shaking。然而,只有import導入和export導出的模塊才會被編譯為ES5,如果希望所有的打包文件都編譯為ES5,你需要使用一個轉譯器來處理剩下來的文件。這里我使用babel。首先安裝babel:
npm install --save-dev babel-core babel-loader babel-preset-es2015
在根目錄下添加.babelrc文件,并添加配置
如果bable的配置仍然為:
{ presets: ['es2015'] }
那么無用的代碼也會被打包(Babel會將ES 6模塊通過commonJs模塊轉換輸出,然后webpack 2就不能進行tree-shaking分析了)。這塊兒大致原理是這樣的。。。
因此我們將配置文件改為:
{ "presets": [ ["es2015", {"modules": false}] ] }
并且在webpack的配置文件中加入如下loader(此處一定不能用use,不知道為啥)
{ test: /\.js$/, loader: 'babel-loader', //此處不能用use,不知道為啥 exclude: /node_modules/ //需要排除的目錄 }
九、熱加載模塊(HMR)
webpack配置文件中,devServer的“inline”選項會為入口頁面添加“熱加載”功能,“hot”選項則開啟“熱替換(Hot Module Reloading)”,即嘗試重新加載組件改變的部分(而不是重新加載整個頁面)。如果兩個參數都傳入,當資源改變時,webpack-dev-server將會先嘗試HRM(即熱替換),如果失敗則重新加載整個入口頁面。要使用HRM,首先需要在webpack配置文件中配置plugin:
plugins: [ ... new webpack.HotModuleReplacementPlugin() // 熱加載插件 ]
到這一步,實際上改變css可以實現hrm,然而js只會刷新整個頁面,index.html直接不刷新了。。。不知道為啥。react可以通過react-transform-hrm來搞定。非react框架現在考慮用webpack-dev-middleware 來嘗試一下
十、生產環境
通過以上步驟基本的開發環境就搭建完畢了,那么實際上在生產環境里可能會有其他的要求,例如分離js與css(目前css是打包到js中去的),例如壓縮代碼等。
首先創建一個webpack.production.config.js,然后在package.json中配置修改為:
"scripts": { "start": "webpack-dev-server", "build": "set NODE_ENV=production&&webpack --config ./webpack.production.config.js" }
當運行 npm run build
的時候,會設置環境變量"NODE_ENV"為"production"。
var prod = process.env.NODE_ENV === 'production' ? true : false;
現在分別介紹幾個常用的插件:
1.提取公共模塊插件(webpack內置) CommonsChunkPlugin
2.壓縮js插件(webpack內置) UglifyJsPlugin
3.分離css文件: ExtractTextPlugin 注意該插件由于和webpack2不兼容,需要指定版本。。在webpack.production.config.js 中的配置,注意與1.x版本loader的寫法不同。
4.清除文件夾: clean-webpack-plugin
運用[hash]使得產生的文件名帶有哈希值,合理使用緩存。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“webpack2.0如何搭建前端項目”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。