├── .babelrc
├── .gitignore
├── READEME.md
├── README.md
├── build
├── webpack.common.js
├── webpack.dev.js
└── webpack.prod.js
├── favicon.ico
├── header.html
├── index.html
├── package.json
├── postcss.config.js
├── proce.js
├── src
├── App.vue
├── api
│ ├── api.js
│ ├── http.js
│ └── interface.js
├── assets
│ ├── css
│ │ ├── index.scss
│ │ └── modules
│ │ │ ├── common.scss
│ │ │ ├── config.scss
│ │ │ ├── normalize.scss
│ │ │ └── reset.scss
│ ├── iconfont
│ │ ├── iconfont.css
│ │ ├── iconfont.eot
│ │ ├── iconfont.js
│ │ ├── iconfont.svg
│ │ ├── iconfont.ttf
│ │ ├── iconfont.woff
│ │ └── iconfont.woff2
│ └── images
│ │ ├── aside
│ │ ├── 1.jpg
│ │ └── 2.jpg
│ │ └── login
│ │ ├── 1.jpg
│ │ ├── 2.jpg
│ │ ├── 3.jpg
│ │ └── 4.jpg
├── components
│ ├── Hello.vue
│ ├── ImgVerify
│ │ └── index.vue
│ └── index.js
├── index.js
├── mock
│ └── index.js
├── router
│ └── index.js
├── store
│ └── index.js
└── views
│ ├── layout
│ ├── aside.vue
│ ├── header.vue
│ └── index.vue
│ └── pages
│ ├── login
│ └── index.vue
│ ├── menu
│ ├── five.vue
│ ├── four.vue
│ ├── one.vue
│ ├── three.vue
│ └── two.vue
│ └── welcome
│ └── index.vue
└── static
└── favicon.ico
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [ // 预设
3 | [
4 | "@babel/preset-env",
5 | {
6 | "targets": { // 需要支持哪些平台+哪些版本
7 | // 针对浏览器版本的配置
8 | "browsers" : ["> 1%", "ie >= 9", "chrome >= 60", "ios >= 9", "android >= 4.0", "last 2 versions"]
9 |
10 | },
11 | // 按需引入 减少打包后的JS文件
12 | "useBuiltIns": "usage"
13 | }
14 | ]
15 | ],
16 | "plugins": [ // 插件
17 | [
18 | "component",
19 | {
20 | "libraryName": "element-ui",
21 | "styleLibraryName": "theme-chalk"
22 | }
23 | ]
24 | ]
25 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .idea/
3 | .sass-cache/
4 | npm-debug.log.*
5 | node_tmp/
6 | .vscode
7 | Thumbs.db
8 | .DS_Store
9 | .svn
10 | package-lock.json
11 | .DS_Store
12 | */.DS_Store
13 | .DS_Store
14 | dist/
15 |
--------------------------------------------------------------------------------
/READEME.md:
--------------------------------------------------------------------------------
1 | ## 一.概念
2 |
3 | webpack 是一个模块打包器(module bundler)。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。
4 |
5 | ### 1.1.入口(entry)
6 |
7 | 指示webpack应该使用哪个模块来作为构建其内部依赖图的入口起点。(默认值为**./src**)
8 |
9 | ### 1.2.出口(output)
10 |
11 | 这个属性告诉webpack在哪里输出它所创建的 bundles,以及如何命名这些文件。(默认值为**./dist**)
12 |
13 | 1. 通过output.filename: 告诉webpack bundle的名称;
14 | 2. 通过output.path:告诉webpack bundle生成(emit)到哪里。
15 |
16 | ### 1.3.加载器(loader)
17 |
18 | 让webpack能够去处理那些非js文件(webpack自身只能处理js),loader可以将所有类型的文件转换为webpack能够处理的模块(modules)。
19 |
20 | 1. test属性:用于标识出应该被对应的loader进行转换的某个或者某些文件;
21 | 2. use属性:用于表示进行转换时,应该使用哪个loader。
22 |
23 | ### 1.4.插件(plugins)
24 |
25 | loader被用于转换某些类型的模块,而插件可以用于执行范围更广的任务,从打包优化到压缩,插件目的在于解决loader无法实现的其他事情。使用步骤为:
26 |
27 | 1. 先require它,然后把它添加到plugins数组中;
28 | 2. 可以在配置文件中因为不同目的而多次使用同一个插件,通过 new 来创建一个它的实例。
29 |
30 | ### 1.5.模式(mode)
31 |
32 | 通过选择development和production之中的一个,来设置mode参数,你可以启用相应模式下的webpack内置的优化。
33 |
34 | ## 二.项目实战
35 |
36 | ### 2.1.初始化项目
37 |
38 | ```js
39 | npm init -y
40 | ```
41 |
42 | 执行上述命令后会生成一个package.json文件,接着安装webpack4
43 |
44 | ### 2.2.安装webpack4
45 |
46 | npm i -D webpack webpack-cli
47 |
48 | 如果你使用的是webpack4+版本,你还需要安装CLI。-D是指开发环境需要,上线不需要。
49 |
50 | ### 2.3.创建目录
51 |
52 | 1. 创建src
53 |
54 | 这个里面放的是源代码,“源”代码是用于书写和编辑的代码。
55 |
56 | 2. 创建dist,并且在该文件夹下创建index.html
57 |
58 | 这个里面放的是分发代码,“分发”代码是构建过程产生的压缩后的“输出”目录,最终将在浏览器中加载;
59 |
60 | index.html页面script引入的标签由原始的./src文件改为加载最终打包后的bundle,main.js;
61 |
62 | 执行 webpack 命令,会将我们的脚步作为入口起点,然后输出 main.js。
63 |
64 | 3. 配置webpack.config.js
65 |
66 | 添加配置文件比在终端中手动输入大量命令要高效的多,所以让我们创建一个取代之前使用CLI选项方式的配置文件。
67 |
68 | ```diff
69 | webpack-demo
70 | |- package.json
71 | + |- webpack.config.js
72 | |- /dist
73 | |- index.html
74 | |- /src
75 | |- index.js
76 | ```
77 |
78 | 考虑到用CLI这种方式来运行本地的webpack很不方便,我们可以通过创建一个npm脚本的方式来设置快捷方式。
79 |
80 |
81 |
82 | ```diff
83 | "scripts": {
84 | "test": "echo \"Error: no test specified\" && exit 1",
85 | + "build": "webpack"
86 | },
87 | ```
88 |
89 | 通过运行 npm run build 命令就可以代替我们之前使用的webpack命令。并且通过向该命令和你的参数见添加两个中横线,可以将自定义参数传递给webpack,npm run build -- --colors。
90 |
91 | ### 2.4.管理资源
92 |
93 | 1.加载css
94 |
95 | ```js
96 | cnpm i -D style-loader css-loader
97 | ```
98 |
99 | 安装上述两个模块,style-loader依赖于css-loader,loader的书写规则为从右到左形成一种依赖关系,最先处理的放在最右边。
100 |
101 | 2.加载图片
102 |
103 | ```js
104 | cnpm i -D file-loader
105 | ```
106 |
107 | 可以看到实际的文件名已更改为诸如hash模式那样前缀的类型,这意味着webpack在src文件中找到我们的图片文件,并成功处理过它,下一步紧接着的就是压缩和优化你的图像。
108 |
109 | ```js
110 | cnpm i -D url-loader
111 | ```
112 |
113 | 提高文件的限制大小,之前是224kib,配置如何展示性能提示。例如,如果一个资源超过250kb,webpack会对此输出一个警告来通知你,performance属性。
114 |
115 | 3.加载字体
116 |
117 | file-loader和url-loader可以接收并加载任何文件,然后将其输出到构建目录,也就是说,我们可以将它们用于任何类型的文件,包括字体。
118 |
119 | ### 2.5.管理输出
120 |
121 | 到目前为止,我们所做的一切都是在index.html文件中手动引入所有资源,然而随着应用程序的增长,使用了多个bundle的时候,需要手动地对index.html文件进行管理,一切就会变得困难起来。可以通过下载一些插件,让我们不用手动更改index.html文件。
122 |
123 | 1.为你自动生成一个HTML文件,其中包括使用script标签的body中的所有webpack包。
124 |
125 | ```js
126 | cnpm i -D html-webpack-plugin
127 | ```
128 |
129 | 由于过去的代码示例遗留下来,导致/dist文件夹相当杂乱,包含了之前的示例代码。webpack会生成文件,然后将这些文件放置在、dist文件夹中,但是webpack无法追踪到哪些文件是实际在项目中所需要使用到的。
130 |
131 | 2.通常,在每次构建前清理/dist文件夹,是比较推荐的做法,因此只会生成用到的文件。
132 |
133 | ```js
134 | cnpm i -D clean-webpack-plugin
135 | ```
136 |
137 | 现在,你不会看到旧的文件,只有构建后生成的文件。
138 |
139 | 3.Manifest,webpack及其插件似乎“知道”应该哪些文件生成,答案是,通过manifest,webpack能够对【你的模块映射到输出bundle的过程】保持追踪。
140 |
141 | ### 2.6.正式开发
142 |
143 | 1.追踪错误和警告在源代码中的原始位置。
144 |
145 | For development, use `cheap-module-eval-source-map`. For production, use `cheap-module-source-map`.
146 |
147 | devtool: 'cheap-module-eval-source-map', // 这是 "cheap(低开销)" 的 source map。
148 |
149 | 2.每次要编译代码时,手动运行 npm run build 就会变得很麻烦。
150 |
151 | ```js
152 | cnpm i -D webpack-dev-server // 提供了一个简单的web服务器,并且能够实时重新加载(live reloading) 在代码发生变化后自动编译代码
153 | ```
154 |
155 | 修改配置文件,告诉开发服务器(dev server),在哪里查找文件:告知webpack-dev-server,在localhost:8080下建立服务,将dist目录下的文件,作为可访问文件。
156 |
157 | ```diff
158 | + devServer: {
159 | + contentBase: './dist'
160 | + },
161 | ```
162 |
163 | Please update `webpack-cli` to v4 and use `webpack serve` to run webpack-dev-server
164 |
165 | ### 2.7.模块热替换
166 |
167 | 模块热替换(Hot Module Replacement 或 HMR)是 webpack 提供的最有用的功能之一。它允许在运行时更新各种模块,而无需进行完全刷新。
168 |
169 | ### 2.8.tree shaking
170 |
171 | Tree Shaking指的就是当我引入一个模块的时候,我不引入这个模块的所有代码,我只引入我需要的代码,这就需要借助webpack里面自带的Tree Shaking这个功能,帮助我们实现。
172 |
173 | 压缩输出:从 webpack 4 开始,也可以通过 `"mode"` 配置选项轻松切换到压缩输出,只需设置为 `"production"`。
174 |
175 | ```diff
176 | + mode: "production"
177 | ```
178 |
179 | ## 三、生产环境
180 |
181 | ### 3.1.生产环境构建
182 |
183 | 开发环境(development):需要强大的、具有实时重新加载(live reloading)或热模块(hot module replacement)能力的source map和localhost server。
184 |
185 | 生产环境(production):我们的目标倾向于关注更小的bundle,更轻量的source map,以及更优化的资源,以改善加载时间。
186 |
187 | 由于这两个环境的构建目标差异很大,并且要遵循逻辑分离,我们通常建议为每个环境编写彼此独立的webpack配置。
188 |
189 | 1.我们还是会遵循不重复原则(Don't repeat yourself - DRY),保留一个“通用”配置。为了将这些配置合并在一起,我们使用“通用”配置。
190 |
191 | ```js
192 | cnpm i -D webpack-merge
193 | ```
194 |
195 | 2.使用tree shaking
196 |
197 | ```js
198 | cnpm i -D uglifyjs-webpack-plugin
199 | ```
200 |
201 | ```diff
202 | + const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
203 | ```
204 |
205 | `UglifyJs` does not support ES6。可以使用 UglifyEs
206 |
207 | 3.配置scripts
208 |
209 | - npm start 定义为开发环境脚本
210 |
211 | - npm run build 定义为生产环境脚本
212 |
213 | 4.指定环境
214 |
215 | 许多库library将通过与环境变量关联,以决定库中应该应用哪些内容。例如,当处于开发环境中,某些库为了使调试变得容易,可能会添加额外的日志记录和测试。
216 |
217 | ```diff
218 | + new webpack.DefinePlugin({
219 | + 'process.env.NODE_ENV': JSON.stringify('production')
220 | + })
221 | ```
222 |
223 | *技术上讲,*`NODE_ENV` *是一个由 Node.js 暴露给执行脚本的系统环境变量。通常用于决定在开发环境与生产环境(dev-vs-prod)下,服务器工具、构建脚本和客户端 library 的行为。*
224 |
225 | ### 3.2.代码分离
226 |
227 | bundle分析输出结果。一款分析 bundle 内容的插件及 CLI 工具,以便捷的、交互式、可缩放的树状图形式展现给用户:
228 |
229 | ```js
230 | cnpm i -D webpack-bundle-analyzer
231 | ```
232 |
233 | 通过使用 `output.filename` 进行[文件名替换](https://www.webpackjs.com/configuration/output#output-filename),可以确保浏览器获取到修改后的文件。`[hash]` 替换可以用于在文件名中包含一个构建相关(build-specific)的 hash,但是更好的方式是使用 `[chunkhash]` 替换,在文件名中包含一个 chunk 相关(chunk-specific)的哈希。输出文件的文件名:
234 |
235 | ```diff
236 | + filename: '[name].[chunkhash].js',
237 | ```
238 |
239 | ### 3.3.shimming
240 |
241 | webpack编译器能够识别遵循ES2015模块的语法、CommonJS或AMD规范编写的模块,然而,一些第三方的库(library)可能会引用一些全局依赖(例如jQuery中的$)。这些库也可能创建一些需要被导出的全局变量。这些“不合符规范的模块”就是shimming发挥作用的地方。
242 |
243 | 1.使用 ProvidePlugin 后,能够在通过webpack编译的每个模块中,通过访问一个变量来获取package包。(如果webpack知道这个变量在某个模块中被使用了,那么webpack将在最终bundle中引入我们给定的package) 自动加载模块,而不必到处 import或require
244 |
245 | ```diff
246 | + plugins: [
247 | + new webpack.ProvidePlugin({
248 | + _: 'lodash'
249 | + })
250 | + ]
251 | ```
252 |
253 | shim是一个库,它将一个新的API引入到旧的环境中,并且仅依靠旧环境中已有的手段实现。polyfil就是一个用在浏览器API上的shim。我们通常的做法是先检查当前浏览器是否支持某个API,如果不支持的话就加载对应的polyfill。然后新旧浏览器就都可以使用这个API了。
254 |
255 | 3.2.渐进式网络应用程序(PWA)
256 |
257 | Progressive Web Application 是一种可以提供类似于原生应用程序体验的网络应用程序。PWA可以用来在离线时能够继续运行功能。
258 |
259 | 1.搭建一个简易服务器,真正的用户是通过网络访问网络应用程序;用户的浏览器会与一个提供所需资源(例如 html、js和css文件)的服务器通讯。
260 |
261 | ```js
262 | cnpm i -D http-server
263 | ```
264 |
265 | ### 3.4.使用环境变量
266 |
267 | 要在开发和生产构建之间,消除webpack.config.js的差异,你可能需要环境变量。
268 |
269 | 直接在命令行环境配置中,通过设置--env并传入尽可能多的环境变量。
270 |
271 | ```bash
272 | webpack --env.NODE_ENV=local --env.production --progress
273 | ```
274 |
275 | ### 3.5.配置process.env
276 |
277 | 通常情况下,我们需要针对不同环境(开发环境、集成环境、生产环境等),进行相应策略的配置(比如是否替换接口地址,代码是否进行压缩等)。webpack就是通过process.env这个属性进行区别的。它是Node.js提供的一个API,它返回的是一个包含用户环境信息的独一性。如果我们给Node.js设置一个环境变量·,并把它挂载到process.env返回的对象上,便可以在代码中进行相应环境的判断。
278 |
279 | 通常的做法是,新建一个环境变量NODE_ENV,用它确定当前所处的开发阶段,生产阶段设为production,开发阶段设为development或staging,然后在脚本中读取process.env.NODE_ENV即可。要说明的是,NODE_ENV 这个名称只是开发社区的一种共识,名称内容是可以修改的。
280 |
281 | 由于Windows和Mac系统有区别,这就会到值我在Windows上开发部署的项目,到了Mac系统下就无法使用了,反之依然。为了解决这个问题,引入cross-env。它是一个跨平台设置环境变量的第三方包,它可以让你一行命令,就能轻松地在多个平台设置环境变量。
282 |
283 | ```js
284 | cnpm i -D cross-env
285 | ```
286 |
287 | 然后package.json文件中配置就可以了。在项目中可以根据这个值来区分当前环境。
288 |
289 | ## 四、项目报错处理
290 |
291 | 1. Error: Cannot find module 'webpack-cli/bin/config-yargs'
292 |
293 | 报错前安装的版本为:
294 |
295 | ```js
296 | "webpack": "4.4.1",
297 | "webpack-cli": "^4.1.0",
298 | "webpack-dev-server": "^3.11.0",
299 | ```
300 |
301 | 原因为webpack新版本并不与现有版本兼容(webpack-cli几天前发布的最新版4.0.0版移除了yargs包,而紧挨4.0.0版本的上一正式版本3.3.12还在:)去寻找适合webpack4的webpack-cli和webpack-dev-server
302 |
303 | ```js
304 | "webpack": "4.4.1",
305 | "webpack-cli": "^3.3.2",
306 | "webpack-dev-server": "^3.11.0",
307 | ```
308 |
309 | 新版本尤其是大的版本更新都改变了很多,很多都从架构上进行了更改,老版本的功能包比如webpack-dev-server就不能兼容新版本的webpack了。那么我们是不是就不能使用最新版本的webpack了?其实不是,想用就要么等兼容版本,要么有精力自己搞一个兼容版本,再或者可以搜索相关功能适合最新webpack的解决方案。
310 |
311 | ## 五、插件详解
312 |
313 | ### 5.1.预处理器postcss-loader
314 |
315 | 用postcss处理css的loader,利用js代码来处理css,负责把css代码解析成抽象语法树结构,再交由插件来进行处理,插件基于css代码的AST所能进行的操作是多种多样的,比如增加浏览器相关的声明前缀。
316 |
317 | ### 5.2.后处理程序autoPrefixer
318 |
319 | 是一个流行的PostCss插件,其作用是为css中的属性添加浏览器特定的前缀,开发人员在编写css时只需要使用css规范中的标准属性名即可。
320 |
321 | ```
322 | #content {
323 | display: flex;
324 | }
325 | ```
326 |
327 | 在经过 Autoprefixer 处理之后得到的css:
328 |
329 | ```
330 | #content {
331 | display: -webkit-box;
332 | display: -webkit-flex;
333 | display: -ms-flexbox;
334 | display: flex;
335 | }
336 | ```
337 |
338 | ### 5.3.拆分css
339 |
340 | webpack4.0以前,我们通过extract-text-webpack-plugin插件,把css样式从js文件中提取到单独的css文件中。webpack4.0以后,官方推荐使用mini-css-extract-plugin插件来打包css文件,会将所有的css样式合并为一个css文件。
341 |
342 | 配置文件如下:
343 |
344 | ```js
345 | module: {
346 | rules: [
347 | // 这个插件应该只在生产环境构建中使用,并且在loader链中不应该有style-loader,特别是我们在开发模式中使用HMR时
348 | {
349 | test: /\.css$/,
350 | use: [ MiniCssExtractPlugin.loader,'css-loader','postcss-loader' ]
351 | }
352 | ],
353 | },
354 | ```
355 |
356 | ### 5.4.用babel转译js文件
357 |
358 | 为了使我们的js代码能够兼容更多的环境我们需要安装依赖
359 |
360 | 1. babel-loader:加载ES2015+代码,然后使用Babel(一个js编译器,让你立即使用下一代的js)转译为ES5,是一个npm包,它使得webpack可以通过babel转译js代码。
361 |
362 | ```json
363 | 注释:(在 babel 7 中 `babel-core` 和 `babel-preset` 被建议使用 `@babel` 开头声明作用域,因此应该分别下载 `@babel/core` 和`@babel/presets`。就类似于 vue-cli 升级后 使用@vue/cli一样的道理 )Babel的功能在于【代码转译】,具体一点,就是将目标代码转译为能够符合期望语法规范的代码。在转译的过程中,babel内部经历了【解析-转换-生成】三个步骤。而`@babel/core`这个库则负责【解析】,具体的【转换】和【生成】步骤则交给各种插件(plugin)和预设(preset)来完成。
364 | ```
365 |
366 | 2. @babel/core:如果你需要以编程的方式来使用Babel,可以使用这个包。
367 |
368 | ```json
369 | 注释:(`@babel/core`的作用是把js代码分析成ast树,方便各个插件分析语法进行相应的处理。有些新语法在低版本js中是不存在的,比如箭头函数,reset函数,函数默认值等,这种语言层面的不兼容只能通过将代码转为ast,分析其语法后再转为低版本的js)
370 | ```
371 |
372 | 3. @babel/preset-env:智能预设,是一系列插件的集合,可以根据配置的目标浏览器或者运行环境来按需加载插件。
373 |
374 | ```json
375 | 注释:(实际上就是各种插件的打包组合,包含了我们在babel7中常用的es2015,es2016, es2017等最新的语法转化插件,允许我们使用最新的js语法,比如let、const、箭头函数等等,但不包括stage-x阶段的插件。也就是说各种转译规则的统一设定,目的是告诉loader要以什么规则来转化成对应的js版本)
376 | ```
377 |
378 | `babel-loader`与`babel-core`的版本对应关系
379 |
380 | 1. `babel-loader` 8.x 对应`babel-core` 7.x
381 | 2. `babel-loader` 7.x 对应`babel-core` 6.x
382 |
383 | 配置文件如下:
384 |
385 | ```js
386 | module: {
387 | // 创建模块时,匹配请求的规则数组。这些规则能够修改模块的创建方式,这些规则能够对模块(module)应用loader,或者修改解析器(parser)。
388 | rules: [
389 | {
390 | test: /\.js$/,
391 | exclude: /node_modules/, // 确保转译尽可能少的文件
392 | use: ['babel-loader?cacheDirectory'] // 将babel-loader提速至少两倍,将转译的结果缓存到文件系统中 将使用默认的缓存目录(node_modules/.cache/babel-loader)
393 | },
394 | { test: /\.(png|svg|jpg|gif)$/, use: ['file-loader'] }, // 解析图片
395 | { test: /.(woff|woff2|eot|ttf|otf)$/, use: ['url-loader'] }, // 解析字体
396 | ]
397 | },
398 | ```
399 |
400 | 你需要创建一个.babelrc文件,让它实际执行操作:
401 |
402 | ```json
403 | {
404 | "presets": ["@babel/preset-env"]
405 | }
406 | ```
407 |
408 | 上面的babel-loader只会将ES6/7/8语法转换为ES5语法,但是对新的api并不会转换,例如(Promise、Generator、Set、Maps、Proxy等),此时我们需要借助babel-polyfill来帮助我们转换:
409 |
410 | ```js
411 | cnpm i -S @babel/polyfill
412 | ```
413 |
414 | 因为polyfill要在编译你的源代码之前执行,所以要安装为dependency而不是devDependency,解决低版本浏览器(比如IE)不兼容问题。
415 |
416 | ## 六、搭建vue环境
417 |
418 | ### 6.1.加载和转译Vue组件
419 |
420 | 1.vue-loader 是webpack的一个预处理器,它允许你以一种成为单文件组件single-file-components(SFCs)的格式来编写Vue组件。
421 |
422 | ```js
423 | cnpm i -D vue-loader
424 | ```
425 |
426 | 前提得先安装vue这个框架:
427 |
428 | ```js
429 | cnpm i -S vue
430 | ```
431 |
432 | ```json
433 | -D:--save-dev 生产环境的包
434 | -S:--save 开发环境的包
435 | ```
436 |
437 | 安装编译.vue组件里的template部分的编译器
438 |
439 | ```js
440 | cnpm i -D vue-template-compiler
441 | ```
442 |
443 | 2.需要注意的是vue-template-compiler编译器的版本必须和基本的 `vue` 包保持同步,这样 `vue-loader` 就会生成兼容运行时的代码。
444 |
445 | 需要注意的是,vue有不同的构建版本。基于构建工具时使用 **ES** **Module**,为打包工具提供的ESM,ESM格式被设计为可以被静态分析,所以打包工具可以利用这一点来进行“tree-shaking”并将用不到的代码排除出最终的包,为这些打包工具提供的默认文件是只有运行时的ES Module构建【vue.runtime.esm.js】
446 |
447 | 在webpack中的配置:
448 |
449 | ```json
450 | // webpack.config.js
451 | const VueLoaderPlugin = require('vue-loader/lib/plugin')
452 |
453 | module.exports = {
454 | module: {
455 | rules: [
456 | // ... 其它规则
457 | {
458 | test: /\.vue$/,
459 | loader: 'vue-loader'
460 | }
461 | ]
462 | },
463 | plugins: [
464 | // 请确保引入这个插件!
465 | new VueLoaderPlugin()
466 | ]
467 | }
468 | ```
469 |
470 | **这个插件是必须的!** 它的职责是将你定义过的其它规则复制并应用到 `.vue` 文件里相应语言的块。例如,如果你有一条匹配 `/\.js$/` 的规则,那么它会应用到 `.vue` 文件里的 `
11 |
12 |