资讯专栏INFORMATION COLUMN

Webpack系列—快速入门

TIGERB / 3391人阅读

摘要:如使用插件为我们自动生成一个文件。安装使用生产和开发构建分离生产和开发中的构建肯定是不同,生产中侧重于一个更好的开发体验,而生产环境中则需要更多的性能优化,更小的。可以指定命令运行以来的配置文件,通过在中写入是一种不错的方式。

原文地址:https://github.com/huruji/blog/issues/3

入口

单文件入口
指定entry键值

const config = {
  entry: "./yourpath/file.js"
};
module.exports = config

上面的是以下的简写:

const config = {
  entry: {
    main: "./yourpath/file.js"
  }
};
module.exports = config

多文件入口
对entry采用对象写法,指定对应的键值对,为了输出这多个文件可以使用占位符

const path = require("path");
const config = {
  entry: {
    app1: "./src/main.js",
    app2: "./src/app.js"
  },
  output: {
    filename: "[name].bundle.js",
    path: path.join(__dirname, "dist")
  }
};

module.exports = config;
输出

指定打包构建之后输出的文件
单文件输出
指定output键值,值为对象,对象中指定path和filename

const path = require("path");
const config = {
  output: {
    filename: "bundle.js",
    path: path.join(__dirname, "dist")
  }
};

module.exports = config;

多文件输出
使用占位符,输出文件将按照多文件入口指定的键来替代占位符

const path = require("path");
const config = {
  entry: {
    app1: "./src/main.js",
    app2: "./src/app.js"
  },
  output: {
    filename: "[name].bundle.js",
    path: path.join(__dirname, "dist")
  }
};

module.exports = config;
Loader

Loader可以在加载模块时预处理文件,类似于gulp中的task。配置loader需要在module选项下指定对应后缀名相应的rules,使用test正则指定后缀名,使用use指定相应的loader

允许在js中import css
需要使用style-loader和css-loader,首先需要安装:

npm i css-loader style-loader --save-dev

使用loader

const path = require("path");

const config = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.join(__dirname, "dist")
  },
  module: {
    rules: [{
      test: /.css$/,
      use: [
        "style-loader",
        "css-loader"
      ]
    }]
  }
};

module.exports = config;

模块文件写法:

import "./css/main.css"

允许加载图片
需要使用file-loader,首先安装:

npm i file-loader --save-dev

使用:

const path = require("path");

const config = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.join(__dirname, "dist")
  },
  module: {
    rules: [{
      test: /.(png|jpg|svg|gif)$/,
      use: [
        "file-loader"
      ]
    }]
  }
};

module.exports = config;

模块文件写法:

import logo from "./image/logo.svg";
插件

插件的目的在于解决loader解决不了的事情,使用插件指定plugins选项即可,需要注意的使用插件需要引入插件。如使用HtmlWebpackPlugin插件为我们自动生成一个html文件。

首先安装:

npm i --save-dev html-webpack-plugin

配置webpack

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const config = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.join(__dirname, "dist")
  },
  module: {
    rules: [{
      test: /.css$/,
      use: [
        "style-loader",
        "css-loader"
      ]
    },{
      test: /.(png|jpg|svg|gif)$/,
      use: [
        "file-loader"
      ]
    }]
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: "我的webpack"
    })
  ]
};

module.exports = config;
使用source map

源代码被webpack打包之后,会很难追踪到原始的代码的位置,使用source map功能,可以将编译后的代码映射回原始代码位置,指定devtool选项即可:

const config = {
  // ....
  devtool: "inline-source-map"
};

module.exports = config;
使用webpack-dev-server

webpack-dev-server提供了一个简单的web服务器,并能够实时重新加载使用webpack需要先安装:

npm i --save-dev webpack-dev-server

在配置文件中指定devServer选项,告诉服务器在哪里寻找文件

const config = {
  // ....
  devServer: {
    contentBase: "./dist"
  }
};

module.exports = config;

使用命令行运行命令或者在package.json中指定scripts

webpack-dev-server --open

此时服务将运行在8080端口,其中open选项表示服务开启之后立即在默认浏览器中打开页面。

开启热更新

开启热更新很简单,只需要更新webpack-dev-server配置,增加hot选项,同时使用webpack自带的HMR插件

const config = {
  // ....
  devServer: {
    contentBase: "./dist",
    hot:true
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin()
  ]
};

module.exports = config;
精简输出

在实际中是开发中可能有些模块的方法并没有被使用,也就是说,在开发中这些方法并没有被import,这些没有被使用的代码应该被删除的,使用uglifyjs-webpack-plugin插件可以帮助我们删除这些代码,同时做代码混淆和压缩。
安装:

npm i -D uglifyjf-webpack-plugin

使用:

const UglifyJSPlugin = require("uglifyjs-webpack-plugin")

const config = {
  // ....
  plugins: [
    new UglifyJSPlugin()
  ]
};

module.exports = config;
生产和开发构建分离

生产和开发中的构建肯定是不同,生产中侧重于一个更好的开发体验,而生产环境中则需要更多的性能优化,更小的chunk。webpakck可以指定命令运行以来的配置文件,通过在package.json中写入script是一种不错的方式。而生产和开发中的配置肯定有很多重复的地方,使用webpack-merge可以合并通用配置
安装:

npm i -D webpack-merge

webpack.common.js

const path = require("path");
const CleanWebpackPlugin = require("clean-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");

const config = {
  entry: "./src/main.js",
  plugins: [
    new CleanWebpackPlugin(["dist"]),
    new HtmlWebpackPlugin({
      title: "My App"
    })
  ],
  output: {
    filename: "bundle.js",
    path: path.join(__dirname, "dist")
  },
}

module.exports = config;

webpack.dev.js

const merge = require("webpack-merge");
const common = require("./webpack.common");

const config = merge(common, {
  devtool: "inline-source-map",
  devServer: {
    contentBase: "./dist"
  }
});

module.exports = config;

webpack.prod.js

const merge = require("webpack-merge");
const UglifyJSPlugin = require("uglifyjs-webpack-plugin");
const common = require("./webpack.common");

const config = merge(common, {
  plugins: [
    new UglifyJSPlugin()
  ]
});

module.exports = config;

package.json

{
  // ......
  "scripts": {
      "start": "webpack-dev-server --open --config webpack.dev.js",
      "build": "webpack --config webpack.prod.js"
    },
  // ......
}

许多lib通过与process.env.NODE_ENV环境关联来决定lib中使用哪些内容,使用webpack内置的DefinePlugin可以为所有依赖指定这个变量。

const config = {
  // ......
  plugins: [
    new webpack.DefinePlugin({
      "process.env": {
        "MODE_ENV": JSON.stringify("production")
      }
    })
  ]
  // ......
}
让输出的文件名带有哈希值

让文件名带有hash可以方便在生产环境中用户及时更新缓存,让文件名带有hash可以使用和构建相关的[hash]占位符,也可以使用与chunk相关的[chunkhash]占位符,通常后一种是更好的选择

const config = {
  //......
  output: {
    filename: [name].[chunkhash].js,
    path: path.join(__dirname, "dist")
  }
  // ......
}
让webpack不打包指定的lib

在开发中有些时候我们需要webpack不打包某些lib,这在我们开发lib的时候特别常见,比如我们为react开发插件,不希望打包的时候包含react。使用配置的external选项可以做到,

const config = {
  "externals": [
    "react",
    "react-dom"
  ]
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85194.html

相关文章

  • webpack 2 实践系列(一) — 安装与入门

    摘要:全局安装安装成功之后,现在命令就在全局生效。为了将依赖关系与捆绑到一起,我们需要导入。执行命令,入口文件为,输出文件,其中未使用的依赖关系不会打入中。现在我们直接运行命令实现与上面相同的功能。 源码地址:https://github.com/silence717/webpack2-demos webpack在你的应用中是一个模块打包工具。webpack可以简化工作流,快速构建一个应用...

    niceforbear 评论0 收藏0
  • webpack入门学习手记(二)

    摘要:例如现在的入门学习手记系列。收到粉丝留言和打赏的喜悦。安装上一篇入门学习手记一,主要是介绍了的核心概念,是整个学习过程的基础知识。新生成的类似如下入门学习手记因为生成的内容过多,我直接省略掉了。 showImg(https://segmentfault.com/img/bVbk5Nd?w=1150&h=599); 本人微信公众号:前端修炼之路,欢迎关注。 最近开始想要维护一个个人的公众...

    Joyven 评论0 收藏0
  • 库,组件,框架 - 收藏集 - 掘金

    摘要:哈哈,我理解,架构就是骨架,如下图所示译年月个有趣的和库前端掘金我们创办的使命是让你及时的了解开发中最新最酷的趋势。 翻译 | 上手 Webpack ? 这篇就够了! - 掘金译者:小 boy (沪江前端开发工程师) 本文原创,转载请注明作者及出处。 原文地址:https://www.smashingmagazine.... JavaSrip... 读 Zepto 源码之代码结构 - ...

    tommego 评论0 收藏0
  • 个人分享--web前端学习资源分享

    摘要:前言月份开始出没社区,现在差不多月了,按照工作的说法,就是差不多过了三个月的试用期,准备转正了一般来说,差不多到了转正的时候,会进行总结或者分享会议那么今天我就把看过的一些学习资源主要是博客,博文推荐分享给大家。 1.前言 6月份开始出没社区,现在差不多9月了,按照工作的说法,就是差不多过了三个月的试用期,准备转正了!一般来说,差不多到了转正的时候,会进行总结或者分享会议!那么今天我就...

    sherlock221 评论0 收藏0

发表评论

0条评论

TIGERB

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<