webpack4 打包静态资源

时间: 2019-07-22阅读: 1103标签: 打包

准备工作

准备一个空文件夹,然后执行下列命令:

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

然后创建一个 dist 目录,并在里面创建一个 indedx.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>webpack4 loader 打包静态资源</title>
</head>
<body>
  <div id="root"></div>

  <!-- 这里引入待会将要打包好的 js 文件 -->
  <script src="./bundle.js"></script>
</body>
</html>

接着创建一个 src 目录,在里面创建一个 lib 文件夹,创建一个 until.js:

// until.js

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

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

再创建 components 文件夹,再写入几个 js:

// 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:

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:

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 中加入:

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

在终端运行npm run bundle执行打包,然后访问 /dist/index.html即可。


打包图片

执行下列命令:

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";
+ }

打包即可,访问网页可以看见图标。


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/4314

关闭

在前端中如何更好地优化打包资源

在前端中但凡谈到打包,肯定要提及到 webpack,毕竟它现在已经是最为流行的打包工具。但 webpack 更多地是表现在 术 上,于是我决定写这篇文章,更多地讲解一些关于 道 的。对于一个前端而言,生产环境的静态资源优化,它既是面试中的高频问题

基于vue-cli的webpack打包优化实践及探索

webpack打包工具成为了前端开发中必备工具,曾经一度的面试题都是问,请问前端页面优化的方式有哪些?大家也是能够信手拈来的说出缓存、压缩文件、CSS雪碧图以及部署CDN等等各种方法

使用 pkg 打包 ThinkJS 项目

在 ThinkJS 的用户群里,经常有开发者提出需要对源码进行加密保护的需求。我们知道 JavaScript 是一门动态语言,不像其他静态语言可以编译成二进制包防止源码泄露。所以就出现了 pkg、nexe 之类的工具

前端打包工具对比

四款前端主流的打包工具:grunt , gulp,webpack, rollup,以发布时间为顺序。Grunt:最老牌的打包工具,它运用配置的思想来写打包脚本,一切皆配置,所以会出现比较多的配置项

解决webpack打包速度慢的解决办法

webpack在打包的时候第一次总是会做很长的准备工作,包括加载插件之类的。在刚接触webpack的时候总是webpack一下-测一下-改一下-再webpack一下,这种方式最后让很多人崩溃了觉得webpack一点都不好用

vue-cli3.0中自定css、js和图片的打包路径

我们有时候因为一些特殊需求,可能需要将js/css/img等资源文件都打包到根路径下,但vue-cli3.0的路径配置中仅有assetsDir配置项能够配置所有的静态文件所在的文件夹,并不能针对css/js/img等资源文件分别来做设置,那么请看我如何尝试的吧!

webpack打包原理

本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

解决webpack引入moment包过大的问题

在vue工程中,在引入moment时,发现build之后的包比不引入moment的包文件大了整整两百多kb,后来发现webpack会把moment的语言包也一起打包

vue实现分环境打包步骤

在新建好的项目中,一般执行npm run build就是打包了,但此时只能打包到一个环境,不同环境需要配置不同的地址,可以手动更改接口的地址,也可以自行配置命令而不需要每次打包进行地址切换

Webpack 打包含动态加载的类库

在编写库的时候,我们有时候会希望按需加载某些依赖,例如如果代码的运行环境不支持某些功能的话,就加载相关的Polyfill。webpack作为当前最流行的打包工具,早已支持动态加载的功能了。本文将讨论一种用webpack打包含动态加载的类库的方法。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!