webpack 配置記錄

webpack 構建說明

github 地址:https://github.com/chick-check/webpack-config-record.git

  1. 創建項目目錄
  • test
    • dist
    • src
      • css
      • js
      • images
      • main.js
      • index.html
  1. 初始化項目 npm init -y ,會生成 package.json 文件
  2. 安裝 webpack 和 webpack-cli(用於在命令行執行 webpack) npm install webpack webpack-cli --save-dev; 當前版本:[email protected] / [email protected] 生成package-lock.json 和 node_modules
  3. 編寫 index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script src = "./main.js"></script>
</body>
</html>
  1. 然後可以通過 webpack ./src/main.js --mode development 將./src/main.js文件打包到 ./dist/main.js; webpack4 默認了打包到的路徑,所以像之前的寫法會報錯。
  2. 每次都通過 webpack ./src/main.js --mode development 打包很麻煩,所以把配置文件寫好,然後直接執行 webpack 就好啦。
  3. 編寫 webpack 配置文件 webpack.config.js,先根目錄添加,在編寫。
const path = require('path')

module.exports = {
    mode:'development',
    entry:path.resolve(__dirname, './src/main.js')
}
  1. 試試在 main.js 裏寫些代碼,看能不能渲染到頁面上去呢?
/*
 1、首先安裝 jquery: npm i jquery
 2、然後導入
 */
import $ from 'jquery'


$(function(){
    $('#tt').css('backgroundColor','lightblue')
})
  1. webpack --watch 可以實時監聽,修改保存後自動打包。
  2. 使用 webpack-dev-server 工具也可以實現自動打包編譯的功能。這個工具的用法和 webpack 一樣。
    安裝webpack-dev-server npm i webpack-dev-server -D ,這是項目中安裝的,所以無法把 webpack-dev-server 當成命令在終端執行。
    此時在 package.json 配置,之後可以直接執行npm run build 執行 webpack-dev-server,–open 打開本地瀏覽器 --port 3000 設置端口號 --contentBase 設置路徑 --hot 熱更新(熱更新可以實現編譯時部分更新;頁面異步更新,而不是刷新整個頁面) ;再執行 npm run build 試試。
   "scripts": {
   "test": "echo \"Error: no test specified\" && exit 1",
   "build": "webpack-dev-server --open --port 3000 --contentBase src --hot"
 }

到這裏也只是完成了自動編譯的功能,修改 main.js 文件並沒有實現打包到 dist/main.js,爲什麼呢?
一下爲執行npm run build 時的輸出信息,可以看出 webpack 被託管於跟目錄,這是因爲通過webpack-dev-server 打包的main.js 文件,並沒有存到實際的物理磁盤中,而是託管到電腦內存中,所以在項目根目錄上,也找不到打包好的 main.js 文件。

[email protected] build /Users/weichaofang/workspaces/test
webpack-dev-server

ℹ 「wds」: Project is running at http://localhost:8080/
ℹ 「wds」: webpack output is served from /
ℹ 「wdm」: Hash: 0122b3897faa80afb5e2

所以修改html 的引入路徑,就可以實現效果了。
這麼做可以提升速度,還不消耗磁盤。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id = "app">
        <h1 id ='tt'>hello</h1>
    </div>
    <script src="/main.js"></script> <!--引入內存裏的 js 文件-->
</body>
</html>
  1. 既然引入的是內存中的 js 文件,那能不能把 html 頁面也放到內存中呢?
    使用 html-webpack-plugin 可以實現
  • 首先安裝插件 npm i html-webpack-plugin -D
  • 配置 webpack.config.js 文件
  const path = require('path')
const htmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    mode:'development',
    entry:path.resolve(__dirname, './src/main.js'),

    plugins:[
        new htmlWebpackPlugin({//創建內存中生成 html 頁面的插件
            template:path.resolve(__dirname,'./src/index.html'), //指定模板頁面,根據這個頁面生成內存中的頁面
            filename:'index.html'
        })
    ]
} 

使用html-webpack-plugin,可以自動在內存中根據指定頁面生成內存中的頁面;自動把打包好的 main.js 文件追加到頁面中,所以不需要指明頁面中 js 文件的引用路徑。

  1. 在 main.js 中使用 import 引入樣式表,保存之後會報錯誤。
//試試 jQuery
/*
 1、首先安裝 jquery: npm i jquery
 2、然後導入
 */
import $ from 'jquery'
import './css/index.css'

$(function(){
    $('#tt').css('backgroundColor','red')
})

這是因爲webpack 默認只處理 js 文件,無法處理其他非 js 文件;此時需要手動安裝第三方 loader 加載器;
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm i style-loader css-loader -D
之後在配置文件裏配置

  module:{
        rules:[
            {
                test:/\.css$/,
                use:['style-loader','css-loader']
            },
            {
                test:/\.scss/,
                use:['style-loader','css-loader','sass-loader']
            },
            { /*
                //webpack 的 css 不能處理 url ,包括圖片和字體,所以需要第三方加載器。limit 給定圖片大小,單位 byte,
                  如果引入的圖片大於等於limit值,不會轉化成 base64;name 表示名字和後綴不進行哈希轉換,和原來的保持一致;
                  可是hash 保證的圖片重名也不會有錯,所以還是需要的,可以截取前8位hash值
                */
                test:/\.(jpg|png|gif|bmp|jpeg)$/, 
                use:'url-loader?limit=7632&name=[hash:8]-[name].[ext]'
            },
            {
                test:/\.(ttf|eot|svg|woff|woff2)$/, 
                use:'url-loader'
            },
            {
                test:/\.js$/,
                use:'babel-loader',
                exclude:/node_modules/ //僅轉換自己寫的 js 文件,排除 node_modules 裏的 js 文件
            }
        ]
    } 
  1. webpack ,默認只能處理部分 es6新語法,此時需要藉助 第三方 loader 幫助處理成低級語法,之後把結果交給 webpack 打包給 main.js
  • cnpm i babel-core babel-loader babel-plugin-transform-runtime -D
  • cnpm i babel-preset-env babel-preset-stage-0 -D
  • 之後在 webpack 配置文件 module 節點 rules 數組中,添加新的匹配規則在項目根目錄,新建 .babelrc 的 Babel 的配置文件,這個配置文件是 json 格式,不能寫註釋,字符串必須用雙引號。【語法】【插件】 是不含 babel-loader 和 babel-preset 的後面部分。
{
    "plugins": ["transform-runtime"],
    "presets": ["env","stage-0"]
}

注意:export default 和 export 是es6 向外暴露成員的方式,兩個方式可以一起用,但是export default只能暴露一次,接收時,參數隨意;export可以多次暴露,名稱不一樣,用{名稱} 接收,名稱 必須和定義時候的一樣;module.exports={} 和 exports 是node 向外暴露成員的方式;
導入模塊:es6 是 import xx from xx;node 是 var a = require(‘模塊標識符’)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章