“约见”面试官系列之常见面试题之第八十一篇之webpack(建议收藏)
從我進(jìn)公司那天起,公司就一直在用webpack,這是一個(gè)前端自動(dòng)打包工具,但我以前從來(lái)沒(méi)接觸過(guò),不過(guò)幸好我聰明機(jī)智,天賦異稟,倒是能上手用,只不過(guò)有些配置還是看不懂,于是,我就趁著項(xiàng)目空閑時(shí)間好好研究了一下webpack這個(gè)打包工具,下面我說(shuō)一下對(duì)webpack的個(gè)人理解:
首先,我覺(jué)得webpack總得來(lái)說(shuō)是一個(gè)js打包工具,它的思想是模塊化思想,一切都可以成為模塊,不管你是js,css,還是scss,less,還是jsx,webpack統(tǒng)統(tǒng)都能打包,它有一個(gè)入口(多頁(yè)面應(yīng)用還沒(méi)研究,,等研究了再發(fā)上來(lái)),所有的要打包的文件,都要通過(guò)這個(gè)入口進(jìn)來(lái),然后再配置一個(gè)出口,就ok了,其中要好多配置,我在這里寫了一個(gè)簡(jiǎn)單的例子,先看我的結(jié)構(gòu)
首先你要初始化一個(gè)package.json,在這之前你要下載安裝一個(gè)node.js,因?yàn)檫@里所有的一切都是基于node.js的
npm init- 1
然后一直回車,就能出來(lái)這個(gè)文件了
webpack三大組成構(gòu)件,是package.json, webpack.config.js, server.js
package.json是下載項(xiàng)目需要的依賴包,webpack.config.js是配置webpack的打包文件的配置,server.js是利用webpack自帶的服務(wù)器在自己電腦上起一個(gè)服務(wù)
下面是webpack.config.js:
這里石油4個(gè)部分組成,1.entry:入口
entry:{"main":["./src/main.js"],"vendor":['jquery']},2.ouput:出口
output:{path:path.resolve(__dirname,'./dist'),filename:"js/[name].bundle.js"},3.module:這個(gè)里面是處理各種文件的loader
module:{loaders: [{test:/\.js$/,loader:'babel-loader',exclude:/node_modules/},{test:/\.scss$/,loader: extractTextWebpackPlugin.extract({fallback: 'style-loader',use: 'css-loader!sass-loader'})},{test:/\.(jpg|png|gif|jpeg)$/,loader: 'url-loader?limit=8192&name=./img/[name].[ext]',},{test: /\.(woff|woff2|svg|eot|ttf)\??.*$/,loader: 'file-loader?name=./fonts/[name].[ext]',},{test: /\.html$/,loader: 'html-withimg-loader'}]},處理圖片,用url-loader,可以把用到的圖片,打包到指定目錄,但是如果單純只是下面的配置的話,只有css中用到的圖片會(huì)被打包過(guò)去,html中的引用的圖片就不會(huì)被打包過(guò)去
test:/\.(jpg|png|gif|jpeg)$/, loader: 'url-loader?limit=8192&name=./img/[name].[ext]',如果想把html中引用的圖片打包過(guò)去的話,需要再下載一個(gè)loader html-withimg-loader
然后再下邊配置
處理字體,用file-loader
處理es6,7等用babel-loader,這個(gè)loader能把es6,7的語(yǔ)言轉(zhuǎn)化為瀏覽器能識(shí)別的es5語(yǔ)法
處理scss,用css-loader和sass-loader,還有style-loader,但是sass-loader的使用必須要有node-sass,所以別忘了下載node-sass
4.plugins:webpack用到的插件
plugins: [new extractTextWebpackPlugin('main.css'),new HtmlWebpackPlugin({filename:'index.html',template:'src/index.html',chunks: ['vendor', 'main']}),new webpack.HotModuleReplacementPlugin(), //熱加載插件new webpack.optimize.CommonsChunkPlugin({name: 'vendor', filename: 'js/vendor.chunk.js'}),new copyWebpackPlugin([{from: './src/mock', to: './mock'}])] extract-text-webpack-plugin,這個(gè)插件是把css從js中分離出來(lái)的插件 html-webpack-plugin,這個(gè)插件是規(guī)定html的入口以及出口路徑,以及script中要引用的文件 HotModuleReplacementPlugin這個(gè)插件屬于熱插拔插件,就是只要項(xiàng)目中任何地方,有改動(dòng),瀏覽器就會(huì)動(dòng)態(tài)刷新,自動(dòng)查看效果,不用手動(dòng)刷新了 webpack.optimize.CommonsChunkPlugin,這個(gè)插件是將引入的依賴的框架代碼統(tǒng)統(tǒng)整合到這個(gè)js文件里面,自己寫的文件在自己的main里面 copyWebpackPlugin,這個(gè)插件是純復(fù)制的一個(gè)插件,把一個(gè)文件夾從某一路徑原封不動(dòng)的復(fù)制到指定路徑,沒(méi)什么好說(shuō)的,可以自行百度下面來(lái)個(gè)整體的配置
webpack.config.js:
const path = require('path'); const webpack = require('webpack'); var extractTextWebpackPlugin = require('extract-text-webpack-plugin'); var HtmlWebpackPlugin = require('html-webpack-plugin'); var copyWebpackPlugin = require('copy-webpack-plugin'); module.exports = {entry:{"main":["./src/main.js"],"vendor":['jquery']},output:{path:path.resolve(__dirname,'./dist'),filename:"js/[name].bundle.js"},module:{loaders: [{test:/\.js$/,loader:'babel-loader',exclude:/node_modules/},{test:/\.scss$/,loader: extractTextWebpackPlugin.extract({fallback: 'style-loader',use: 'css-loader!sass-loader'})},{test:/\.(jpg|png|gif|jpeg)$/,loader: 'url-loader?limit=8192&name=./img/[name].[ext]',},{test: /\.(woff|woff2|svg|eot|ttf)\??.*$/,loader: 'file-loader?name=./fonts/[name].[ext]',},{test: /\.html$/,loader: 'html-withimg-loader'}]},plugins: [new extractTextWebpackPlugin('main.css'),new HtmlWebpackPlugin({filename:'index.html',template:'src/index.html',chunks: ['vendor', 'main']}),new webpack.HotModuleReplacementPlugin(), //熱加載插件new webpack.optimize.CommonsChunkPlugin({name: 'vendor', filename: 'js/vendor.chunk.js'}),new copyWebpackPlugin([{from: './src/mock', to: './mock'}])] }第三大塊,server.js,在自己的本地起一個(gè)服務(wù)
var webpack = require('webpack'); var webpackDevServer = require('webpack-dev-server');var config = require('./webpack.config.js'); config.entry.main.unshift("webpack-dev-server/client?http://0.0.0.0:2014/", "webpack/hot/dev-server");var server = new webpackDevServer(webpack(config),{contentBase: './dist'//這是基于哪個(gè)文件夾,noInfo: false,historyApiFallback: true,disableHostCheck: true })server.listen(2014, '0.0.0.0', function (err) {if(err){console.log(err);}console.log('listening at localhost:2014') })下面看一下我的各種文件
html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Document</title><link rel="stylesheet" type="text/css" href="./main.css"> </head> <body><div>你好adfsg</div><i class="fa fa-taxi" aria-hidden="true"></i><img src="img/54587e7333ef462e0d67b0b63a79d230.jpg"> </body> </html>main.js:
require('./main.scss'); var sum = () => 1 + 2; // var sum = function() { // return 1 + 2; // }; console.log(sum());main.scss:
@import './css/font-awesome.css'; h1{color:#000;background: url('img/21464b3c0951c7ce99c2acdf0bcaebb0.jpg'); } .add{background: url('img/72f082025aafa40f34c69ce4a064034f78f01982.jpg'); } .add2{background: url('img/20130322201640_n8dyK.thumb.700_0.jpeg'); }package.json:
{"name": "webpack-demo2","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","start": "webpack --config ./webpack.config.js","server": "node ./server.js"},"author": "","license": "ISC","devDependencies": {"babel-core": "^6.26.0","babel-loader": "^7.1.2","copy-webpack-plugin": "^4.3.1","css-loader": "^0.28.7","extract-text-webpack-plugin": "^3.0.2","file-loader": "^1.1.6","html-webpack-plugin": "^2.30.1","html-withimg-loader": "^0.1.16","jquery": "^3.2.1","node-sass": "^4.7.2","sass-loader": "^6.0.6","style-loader": "^0.19.1","url-loader": "^0.6.2","webpack": "^3.10.0","webpack-dev-server": "^2.9.7"},"dependencies": {"scss-loader": "^0.0.1"} }下面是打包過(guò)后的目錄
運(yùn)行效果
今天就到這里吧,,根據(jù)自己的理解說(shuō)的,如果有哪里錯(cuò)了,,請(qǐng)及時(shí)指正,或者補(bǔ)充,我也在學(xué)習(xí)階段!
本面試題為前端??济嬖囶},后續(xù)有機(jī)會(huì)繼續(xù)完善。我是歌謠,一個(gè)沉迷于故事的講述者。
歡迎一起私信交流。
“睡服“面試官系列之各系列目錄匯總(建議學(xué)習(xí)收藏)?
總結(jié)
以上是生活随笔為你收集整理的“约见”面试官系列之常见面试题之第八十一篇之webpack(建议收藏)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端学习(2256)如何解决冲突
- 下一篇: 前端学习(2151):webpack之使