webpack4 打包靜態資源

demo 代碼點此,開始以前,先作點準備工做。css

準備工做

準備一個空文件夾,而後執行下列命令:html

npm init -y
npm i -D webpack webpack-cli

而後建立一個 dist 目錄,並在裏面建立一個 indedx.html:webpack

<!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>webpack4 loader 打包靜態資源</title>
</head>
<body>
  <div id="root"></div>

  <!-- 這裏引入待會將要打包好的 JS 文件 -->
  <script src="./bundle.js"></script>
</body>
</html>

接着建立一個 src 目錄,在裏面建立一個 lib 文件夾,建立一個 until.js:git

// until.js

export function $ (id) {
  return document.getElementById(id);
}

export function add (x, y) {
  return x + y;
}

再建立 components 文件夾,再寫入幾個 js:github

// Content.js
import { $ } from '../lib/until';

export default function Content () {
  let content = document.createElement('div');
  content.innerText = 'content';
  $('root').appendChild(content);
}

// Footer.js
import { $ } from '../lib/until';

export default function Footer () {
  let footer = document.createElement('div');
  footer.innerText = 'footer';
  $('root').appendChild(footer);
}

// Header.js
import { $ } from '../lib/until';

export default function Header () {
  let header = document.createElement('div');
  header.innerText = 'header';
  $('root').appendChild(header);
}

在 src 下建立 index.js:web

import Header from './components/Header';
import Content from './components/Content';
import Footer from './components/Footer';
import { $ } from './lib/until';

Header();
Content();
Footer();

配置 webpack

在根目錄下,建立 webpack.config.js:shell

const path = require('path');

module.exports = {
  // mode: 'production',
  mode: 'development',
  // 入口
  // entry: './src/index.js',
  entry: {
    main: './src/index.js',
  },
  // 出口
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
}

而後在 package.json 中的 scripts 中加入:npm

"scripts": {
  ...
+  "bundle": "webpack"
},

在終端運行npm run bundle執行打包,而後訪問 /dist/index.html便可。json

打包圖片

執行下列命令:瀏覽器

npm i -D url-loader

而後在 src 下建立 assets/images/ 文件夾,而後放入一張圖片便可:

/src/assets/images/webpack.jpg

而後修改 webpack.config.js:

const path = require('path');

module.exports = {
  // mode: 'production',
  mode: 'development',
  // 入口
  // entry: './src/index.js',
  entry: {
    main: './src/index.js',
  },
+  module: {
+    rules: [{
+      // 打包圖片
+      test: /\.(jpg|png|gif)$/,
+      use: {
+        // loader: 'file-loader',
+        loader: 'url-loader',
+        options: {
+          name: '[name]_[hash].[ext]',
+          outputPath: 'images/',
+          limit: 8192,
+        },
+      },
+    },
+  },
  // 出口
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
}

再修改 index.js:

import Header from './components/Header';
import Content from './components/Content';
import Footer from './components/Footer';
+ import webpack from './assets/images/webpack.jpg';
import { $ } from './lib/until';

Header();
Content();
Footer();

+ let root = $('root');
+ let img = new Image();
+ img.src = webpack;
+ img.id = 'img';
+ root.appendChild(img);

執行打包便可。

打包css、less、scss

這裏僅配置 less,安裝 loader:

npm i -D less less-loader css-loader style-loader postcss-loader

在 src 下建立 index.less:

// index.less
body {
  background-color: #ffffff;
}

#img {
  transform: translate(50px, 0);
}

而後修改 webpack.config.js:

const path = require('path');

module.exports = {
  // mode: 'production',
  mode: 'development',
  // 入口
  // entry: './src/index.js',
  entry: {
    main: './src/index.js',
  },
  module: {
    rules: [{
      // 打包圖片
      test: /\.(jpg|png|gif)$/,
      use: {
        // loader: 'file-loader',
        loader: 'url-loader',
        options: {
          name: '[name]_[hash].[ext]',
          outputPath: 'images/',
          limit: 8192,
        },
      },
    },
+    {
+      // 打包 css、less
+      test: /\.(css|less)$/,
+      use: [
+        'style-loader', 
+        {
+          loader: 'css-loader',
+          options: {
+            importLoaders: 2,
+          }
+        },
+        'less-loader',
+        'postcss-loader',
+      ],
+    }],
  },
  // 出口
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
}

再修改 index.js:

import Header from './components/Header';
import Content from './components/Content';
import Footer from './components/Footer';
import webpack from './assets/images/webpack.jpg';
import { $ } from './lib/until';
+ import './index.less';

Header();
Content();
Footer();

let root = $('root');
let img = new Image();
img.src = webpack;
img.id = 'img';
root.appendChild(img);

安裝 autoprefixer 爲 css 自動添加瀏覽器前綴:

npm i -D autoprefixer

而後在根目錄建立 postcss.config.js:

module.exports = {
  plugins: {
    'autoprefixer': {
      overrideBrowserslist: [
        "Android 4.1",
        "iOS 7.1",
        "Chrome > 31",
        "ff > 31",
        "ie >= 8"
      ]
    },
  }
}

接着打包便可。

打包字體文件

安裝 loader:

npm i -D file-loader

修改 webpack.config.js:

const path = require('path');

module.exports = {
  // mode: 'production',
  mode: 'development',
  // 入口
  // entry: './src/index.js',
  entry: {
    main: './src/index.js',
  },
  module: {
    rules: [{
      // 打包圖片
      test: /\.(jpg|png|gif)$/,
      use: {
        // loader: 'file-loader',
        loader: 'url-loader',
        options: {
          name: '[name]_[hash].[ext]',
          outputPath: 'images/',
          limit: 8192,
        },
      },
    },
    {
      // 打包 css、less
      test: /\.(css|less)$/,
      use: [
        'style-loader', 
        {
          loader: 'css-loader',
          options: {
            importLoaders: 2,
            // css 模塊化
            // modules: true,
          }
        },
        'less-loader',
        'postcss-loader',
      ],
    },
    {
+      // 打包字體文件
+      test: /\.(eot|ttf|svg|woff|woff2)$/,
+      use: {
+        loader: 'file-loader',
+        options: {
+          outputPath: 'font/',
+        }
+      },
+    }],
  },
  // 出口
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
}

而後建立文件夾 /src/assets/font/,在裏面放一下字體文件,我放的是圖標的字體文件。

// 這些是我放入的字體文件
iconfont.eot
iconfont.svg
iconfont.ttf
iconfont.woff
iconfont.woff2

修改 index.js:

import Header from './components/Header';
import Content from './components/Content';
import Footer from './components/Footer';
import webpack from './assets/images/webpack.jpg';
import { $ } from './lib/until';
import './index.less';

Header();
Content();
Footer();

let root = $('root');
let img = new Image();
img.src = webpack;
img.id = 'img';
root.appendChild(img);

+ let div = document.createElement('div');
+ div.classList.add('iconfont', 'icon-chenggong');
+ root.appendChild(div);

再修改 index.less:

body {
  background-color: #ffffff;
}

#img {
  transform: translate(50px, 0);
}

+ @font-face {font-family: "iconfont";
+   src: url('./assets/font/iconfont.eot?t=1563786008234');
+   src: url('./assets/font/iconfont.eot?t=1563786008234#iefix') format('embedded-opentype'),
+   url('data:application/x-font-woff2;charset=utf-8;base64,') format('woff2'),
+   url('./assets/font/iconfont.woff?t=1563786008234') format('woff'),
+   url('./assets/font/iconfont.ttf?t=1563786008234') format('truetype'), 
+   url('./assets/font/iconfont.svg?t=1563786008234#iconfont') format('svg');
+ }
+ 
+ .iconfont {
+   font-family: "iconfont" !important;
+   font-size: 16px;
+   font-style: normal;
+   -webkit-font-smoothing: antialiased;
+   -moz-osx-font-smoothing: grayscale;
+ }
+ 
+ .icon-chenggong:before {
+   content: "\e873";
+ }

打包便可,訪問網頁能夠看見圖標。

備註

具體可查看 webpack4 官網

相關文章
相關標籤/搜索