webpack使用介绍与安装

首先要明白为什么要使用webpack了?前端开发人员在编写前端代码后,不会像移动端一样,在发布的时候我们都是提供安装包给用户进行安装的,而前端是直接发布在服务器,通过浏览器进行访问,并且可以直接查看源码,为了防止源码不被外泄,我们可能会用一些JS工具对代码进行压缩,但如果每次发布都要对代码进行压缩,是相当麻烦后,为了解决这一问题,就出现了很多的自动压缩工具和自动打包工具,比如常见的有GruntGulpFis3webpack,由于工作中用的webpack比较多,所以主要来学习一下webpack

介绍

Webpack是一个前端资源加载/打包工具,只需要相对简单的配置就可以提供前端工程化需要的各种功能。可以打包所有的样式、图片、JS、资源等。

作用

使用webpack可以很方便的项目中的文件进行打包,当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。其主要作用包括以下几点:

  • 可以很方便的将sass/less 等预编译文件转换成标准的css文件,让浏览器识别css代码。
  • 快速搭建本地开发环境,开发的时候可以直接在本地服务器上运行。
  • 监视文件改动,并进行热部署,当修改文件后,将自动刷新浏览器进行预览。
  • 可以将多个预编译文件打包成一个文件。
  • 打包image、styles、assets、scrips等前端常用的文件。

安装

使用npm的如下命令可以进行webpack的安装,如下所示:

npm install webpack webpack-cli --save-dev

关于npm的使用,可以查看之前总结的文章

创建配置文件

虽然webpack4.0可以不用配置文件了,但为了方便起见,创建一个配置文件更容易管理相关的配置信息,直接在项目的根路径下创建 个webpack.config.js的文件。文件中的内容如下所示:

const path = require('path');
module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    }
};

配置命令语句

为了方便的使用命令语句,在中可以package.json文中中的scripts处配置一条命令语句,如下所示:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --config webpack.config.js --mode production"
  },

执行npm run build命令后,将./src/index.js文件进行压缩并输出到bundle.js文件中。

配置文件介绍

1.entry

entry: {
    app: './src/main.js'
  },

通过entry可以配置webpack打包时的起始文件,通过该文件找出哪些文件和库是入口起点(直接和间接)依赖的。比如初始化一个vue项目后,项目将默认以./src/main.js文件作为入口起点,在./src/main.js文件中将引入项目中所依赖的第三方库。如下所示:

import Vue from 'vue'
import App from './App'
import router from './router'
Vue.config.productionTip = false
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

entry除了指定单个文件外,还可以支持以多个文件作为入口起点,多文件的配置方式如下所示:

const config = {
  entry: {
    app: './src/app.js',
    vendors: './src/vendors.js'
  }
};

2.output

output是指通过webpack打包后的文件将以什么文件名输出到指定的目录下,默认为./dist目录下,以下为配置好的output

const path = require('path');

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'app.bundle.js'
  }
};
  • filename :输出的文件名。
  • path :输出文件的目录。其中__dirname是指脚本执行的路径,一般是项目的绝对路径。
    如果entry配置了多个入口文件时,可以使用[name].js点位符的方式来指定输出文件的名称,如下所示:
const path = require('path');
module.exports = {
    entry: {
        index:'./src/index.js',
        app:'./src/app.js'
    },
    output: {
        filename: '[name].bundle.js',
        path: path.resolve(__dirname, 'dist')
    }
};

3.loader

loader是可以让webpack去处理非js文件,loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后就可以利用 webpack 的打包能力,对它们进行处理。使用import可以导入任何文件,比如我们新建了一个json文件,然后import引入该文件时,执行npm run build命令,控制台将会报错,如下所示:

Module not found: Error: Can't resolve 'test.json'

这时候就需要使用loader来配置了。如下所示:

module: {
        rules: [
            {
                test: /\.json$/,
                type: 'javascript/auto',
                loader: 'json-loader'
            },
        ]
    }

由于使用了json-loader,首先需要安装该库,执行以下命令进行安装:

npm install --save-dev json-loader

在 webpack 的配置中 loader 有两个参数:

  • test 属性,用于标识出应该被对应的 loader 进行转换的某个或某些文件。
  • use 属性,表示进行转换时,应该使用哪个 loader。
    配置好后,当执行build命令的时候,在碰到「在 require()/import 语句中被解析为 '.json' 的路径」时,先使用 json-loader 转换一下。

4.plugins

loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。使用插件时,首先需要安装插件库,再使用require()来引入,然后把它添加到plugins数组中,以添加HtmlWebpackPlugin插件为例:

  • 首先安装插件:
npm install --save-dev html-webpack-plugin
  • 引入插件
var HtmlWebpackPlugin = require('html-webpack-plugin');
  • 配置插件
plugins: [new HtmlWebpackPlugin()]

然后执行build命令,将在dist目录下创建一个 html文件,如下所示:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Webpack App</title>
  </head>
  <body>
    <script type="text/javascript" src="index.bundle.js">
    </script><script type="text/javascript" src="app.bundle.js"></script>
</body>
</html>

5.模式

通过选择 developmentproduction 之中的一个,来设置 mode 参数,用于设置开发模式还是生产模式。如下所示:

module.exports = {
  mode: 'production'
};
  • development
    会将 process.env.NODE_ENV 的值设为 development。启用 NamedChunksPlugin 和 NamedModulesPlugin。
  • production
    会将 process.env.NODE_ENV 的值设为 production。启用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin 和 UglifyJsPlugin.
    启用的相关插件,将在后续的插件篇中再补充其相关的用途。
    整个配置文件的代码如下所示:
const path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: {
        index:'./src/index.js',
        app:'./src/app.js'
    },
    output: {
        filename: '[name].bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                test: /\.json$/,
                type: 'javascript/auto',
                loader: 'json-loader'
            },
        ]
    },
    plugins: [new HtmlWebpackPlugin()]
};

个人博客

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

推荐阅读更多精彩内容