Webpack

Webpack

定义:前端静态模块打包工具

一、前端模块化

1.1前端模块化方案:AMD、CMD、CommonJS、ES6

1.2在ES6之前,如果想要进行模块化开发,就必须借助其他工具,并且在模块化开发完成项目后需要处理每个模块之间的依赖关系,并将其整合打包

1.3webpack核心就是让我们进行模块化开发,并且会帮助处理模块之间的依赖关系

1.4不仅仅时JS文件,CSS、img、json文件等都会被当作模块化使用

二、安装

2.1webpack为了可以正常运行,依赖node环境

2.2node环境为了可以正常执行很多代码,必须其中包含各种依赖的包

2.3node内部有npm工具,负责安装各种各样的包

// 1.检测node版本
node -v

// 2.全局安装webpack
npm install webpack@3.6.0 -g

三、基本使用

3.1文件夹src和打包文件夹dist

3.2src文件夹中需要一个main.js作为入口

3.3dist文件夹中有一个bundle.js的打包文件

3.4终端写法:webpack ./src/main.js ./dist/bundle.js--从main.js打包到bundle.js

3.5index.html只需要引入打包好的bundle.js即可

// CommonJS结合webpack

// math.js导出
function add(a, b) {
    return a + b;
};
function mul(a, b) {
    return a * b;
};
// 导出
module.exports = {
    add,
    mul
};

// main.js导入
const { add, mul } = require("./math.js");
// ES6结合webpack

// info.js导出
const name = "yg";
const age = 25;
const height = 1.93;
// 导出
export {name, age, height};

// main.js导入
import {name, age, height} from "./info.js";

四、配置

智能配置入口和出口文件

4.1新建文件名称:webpack.config.js

4.2通过CommonJS导出指定入口和出口

module.exports = {
    entry: "入口文件",
    output: "出口文件"
}
// 1.导入path
const path = require("path");

// 2.执行npm init初始化,会自动安装配置好package.json

// 3.通过npm install可以安装依赖文件,会多一个package-lock.json

// 4.在package.json脚本文件里写入"build": "webpack",可以执行npm run build进行打包,这里默认是全局的webpack

// 5.安装本地webpack:npm install webpack@3.6.0 --save-dev(表示开发时依赖,打包前需要,之后不需要),在package.json中会多一个devDependencies,多一个node_modules文件夹

// 6.只要在终端写的webpack都是运行的全局的,在package.json中的webpack是本地的
// 通过CommonJS导出
module.exports = {
  // 入口
  entry: "./src/main.js",
  // 出口
  output: {
    // 路径拼接调用path的resolve方法:第一个参数是__dirname,第二个参数是出口文件夹名
    path: path.resolve(__dirname, "dist"),
    // 出口文件名
    filename: "bundle.js",
    // 涉及任何url都会在前面拼接dist
    publicPath: "dist/"
  }
}

五、loader

webpack的核心概念loader

5.1通过npm安装需要使用的loader

5.2在webpack.config.js中的module关键字进行配置

5.3--save-dev表示只有开发时依赖;--save表示运行时依赖

css-loader/style-loader

// main.js引入依赖其他css文件
require("./css/base.css"); // CommonJS
import "./css/base.css";  // ES6

// 安装css-loader
npm install --save-dev css-loader@2.0.2
//安装style-loader
npm install --save-dev style-loader@0.23.1

// 配置
{
  // css-loader只负责文件加载
  // style-loader负责将样式添加到dom
  // 使用多个loader从右向左读取
  test: /\.css$/i,
  use: ["style-loader", "css-loader"],
},

less-loader:针对less样式

// 安装
npm install less less-loader@4.1.0 --save-dev

// 配置
{
  test: /\.less$/i,
  loader: [
    // compiles Less to CSS
    'style-loader',
    'css-loader',
    'less-loader',
  ],
},

url-loader/file-loader:针对图片问题

// 安装
npm install --save-dev url-loader@1.1.2
npm install --save-dev file-loader@3.0.1

// 配置
{
  test: /\.(png|jpg|gif|jpeg)$/i,
  use: [
    {
      loader: 'url-loader',
      options: {
        // 当加载图片小于limit时,会将图片编译成base64形式
        // 当加载图片大于limit时,需要安装file-loader@3.0.1
        limit: 8192,
        // 对打包好的图片进行规范化命名
        // img文件夹下的[动态初始名][动态哈希值8位][动态后缀名],用点连接
        name: "img/[name].[hash:8].[ext]"
      },
    },
  ],
},
  
// 图片未显示是因为路径报错,需要在outoput位置配置公共路由
publicPath: "dist/"

babel-loader::针对ES6语法转换为ES5

// 安装
npm install --save-dev babel-loader@7 babel-core babel-preset-es2015

// 配置
{
  test: /\.m?js$/,
  // 排除
  exclude: /(node_modules|bower_components)/,
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['es2015']
    }
  }
}

六、引用VUE

// 安装
npm install --save vue@2.5.12
npm install --save-dev vue-loader@14.2.2 vue-template-compiler@2.5.12

七、插件plugins[数组类型]

7.1版权声明插件

// 自带插件,不需要安装

// 导入webpack
const webpack = require("webpack");

// 使用
new webpack.BannerPlugin("最终版权归coderyg所有"),

7.2打包html的插件

作用:

7.2.1.1自动生成一个index.html文件;

7.2.1.2将打包的js文件,自动通过script标签插入到body中

注意:

7.2.2.1template表示根据什么模板来生成html;

7.2.2.2需要删除publicPath属性,否则插入的script标签中的src可能会有问题

// 安装
npm install --save-dev html-webpack-plugin@3.2.0

// 导入
const HtmlWebpackPlugin = require("html-webpack-plugin");

// 使用
new HtmlWebpackPlugin({
  // 根据index.html为模板生成
  template: "index.html"
}),

7.3压缩丑化插件

// 安装
npm install --save-dev uglifyjs-webpack-plugin@1.1.1

// 导入
const uglifyJsPlugin = require("uglifyjs-webpack-plugin");

// 使用
new uglifyJsPlugin()

八、搭建本地服务器

// 安装
npm install --save-dev webpack-dev-server@2.9.1

// 设置
// webpack.config.js配置
devServer: {
    // 为哪个文件夹提供服务,默认是根文件夹
    contentBase: "./dist"
    // 端口号
    prot: ""
    // 页面实时刷新
    inline: true
    // 在SPA页面中,依赖HTML5的history模式
    historyApiFallback: ""
}
// package.json配置
"dev": "webpack-dev-server --open"

// 使用
npm run dev
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容