二、webpack的打包原理
识别入口文件
通过逐层识别模块依赖(Commonjs、amd或者es6的import,webpack都会对其进行分析,来获取代码的依赖)
webpack做的就是分析代码,转换代码,编译代码,输出代码
最终形成打包后的代码
三、什么是loader
loader是文件加载器,能够加载资源文件,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中
由于webpack 本身只能打包commonjs规范的js文件,所以,针对css,图片等格式的文件没法打包,就需要引入第三方的模块进行打包。
loader虽然是扩展了 webpack ,但是它只专注于转化文件(transform)这一个领域,完成压缩,打包,语言翻译。
loader是运行在NodeJS中。
仅仅只是为了打包
如:css-loader和style-loader模块是为了打包css的
babel-loader和babel-core模块时为了把ES6的代码转成ES5
url-loader和file-loader是把图片进行打包的。
处理一个文件可以使用多个loader,loader的执行顺序和配置中的顺序是相反的,即最后一个loader最先执行,第一个loader最后执行
第一个执行的loader接收源文件内容作为参数,其它loader接收前一个执行的loader的返回值作为参数,最后执行的loader会返回此模块的JavaScript源码
四、什么是plugin
在webpack运行的生命周期中会广播出许多事件,plugin可以监听这些事件,在合适的时机通过webpack提供的API改变输出结果。
五、loader和plugin的区别
从运行时机的角度区分
1 . loader运行在打包文件之前(loader为在模块加载时的预处理文件)
2. plugins在整个编译周期都起作用。从运行时机的角度区分
对于loader,它是一个转换器,将A文件进行编译形成B文件,这里操作的是文件,比如将A.scss转换为A.css,单纯的文件转换过程
plugin是一个扩展器,它丰富了webpack本身,针对是loader结束后,webpack打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听webpack打包过程中的某些节点,执行广泛的任务
使用该plugin后,执行的顺序:
webpack启动后,在读取配置的过程中会执行new MyPlugin(options)初始化一个MyPlugin获取其实例
在初始化compiler对象后,就会通过compiler.plugin(事件名称,回调函数)监听到webpack广播出来的事件
并且可以通过compiler对象去操作webpack
也许,你知道他
也许,你不知道他
在某年夏天傍晚的烧烤摊旁
在堵车一旁的车上
在某个风雨飘摇的夜里
20某某年 或更远的199几年
记不清了
放下或拾取
岁月如梭,
人的脚步走走停停
留下些许记忆的琐碎事情,难以忘怀
冬的清冷,冬去春来
笑颜依稀
在 Typescript 2.0 中使用 @type 类型定义
基于 Typescript 开发的时候,很麻烦的一个问题就是类型定义。导致在编译的时候,经常会看到一连串的找不到类型的提示。解决的方式经过了许多的变化,从 DefinitelyTyped 到 typings。最后是 @types。在 Typescript 2.0 之后,推荐使用 @types 方式。
DefinitelyTyped
这个工具已经不被推荐,仅作介绍。
多数来自 javascript 的库是没有 TypeScript 类型定义的。为了解决这个问题,DefinitelyTyped 被创建出来,它提供了多数流行的脚本库的 TypeScript 定义,你可以使用名为 tsd 的一个工具来管理它。
首先,你需要安装这个工具。
npm install tsd -g
然后,可以使用这个工具来安装你需要的定义库。比如 jquery 的定义库。
tsd install jquery --save
如果提供了 --save 参数,它会创建一个名为 tsd.json 的配置文件来保存所管理的类型定义包。看起来如下所示。
{ "version": "v4", "repo": "DefinitelyTyped/DefinitelyTyped", "ref": "master", "path": "typings", "bundle": "typings/tsd.d.ts", "installed": { "node/node.d.ts": { "commit": "6834f97fb33561a3ad40695084da2b660efaee29" } } }
以后,直接使用
tsd install
就可以安装定义在配置文件中的所有的包了。
Typings
这个也不推荐了。
后来,我们有了 Typings, 这是也是一个用来管理 Typescript 定义的库,你需要安装这个应用。
# Install Typings CLI utility. npm install typings --global
如果需要一个库的定义文件,比如 react
typings install react --save
安装之后,在你的项目文件夹中会自动创建一个名为 typings 的文件夹来专门保存类型定义的库。
如果这个定义来自 DefinitelyTyped, 则现有加上一个参数 --ambient
typings install jquery --ambient --save
它自己需要一个配置文件 typings.json,可以用它来管理项目使用到的类型定义,这样,类似于 NPM,我们可以使用 install 命令来自动安装需要的类型定义。
typings install
这个 typings.json 文件的内容示例如下。
{ "ambientDependencies": { "jquery": "registry:dt/jquery#1.10.0+20161119044246" }, "dependencies": { "react": "registry:npm/react#15.0.1+20160601175240" } }
还是需要专门的工具来管理类型系统。我们可以让这个问题更加简单一点。
@Types
使用另外一套系统来管理类型定义显然不太方便。
在 Typescript 2.0 之后,TypeScript 将会默认的查看 ./node_modules/@types 文件夹,自动从这里来获取模块的类型定义,当然了,你需要独立安装这个类型定义。
比如,你希望 core.js 的类型定义,那么,你需要安装这个库的定义库。
npm install --save @types/core-js
与我们安装一个普通的库没有区别。当然了,常用的 jquery 也有。Microsoft 在 The Future of Declaration Files 介绍了 TypeScript 的这个新特性。
默认情况下,所有的 @types 包都会在编译时应用,任意层的 node_modules/@types 都会被使用,进一步说,在 ./node_modules/@types/
,../node_modules/@types/
, ../../node_modules/@types/
都被应用。
如果你的类型定义不在这个文件夹中,可以使用 typesRoot 来配置,只有在 typeRoots 中的包才会被包含,例如:
{ "compilerOptions": { "typeRoots" : ["./typings"] } }
现在,只有在 ./typings 中的才会应用,而 ./node_modules/@types 中的则不会。
如果配置了 types,则只有列出的包才会包含。
{ "compilerOptions": { "types" : ["node", "lodash", "express"] } }
这样将只会包含 ./node_modules/@types/node, ./node_modules/@types/lodash 和 ./node_modules/@types/express ,其它的则不会被包含进来。
如果配置为
"types": []
则不会包含任何包。
Reference
问题一
ts 无法识别$ref
解决方法
① 直接在 this.$refs.xxx 后面申明类型如:
② 在export default class xxx extends Vue里面声明全部的$ref 的类型
问题二
ts 无法识别 require
解决方法
安装声明文件
问题三
运行npm run build 出现
解决方法
也就是说升级你的uglifyjs-webpack-plugin版本:
问题四
vue-property-decorator 装饰器写法不对。当时我是要把 mixins,注入到组件里,我就这样写:
ts提示找不到 mixin。我就很纳闷为什么找不到名字,由于官网vue-property-decorator例子太少,只好一步一步摸索?
解决方法
把mixins写在@Component里面…,像这样:
注意点
如果你引用第三方无类型声明的库,那就需要自己编写x.d.ts文件
如果引用 ui 组件的时候,如果控制台出现Property '$xxx' does not exist on type 'App'的话,那么可以在vue-shim.d.ts增加

juejing 掘金谷歌插件,实时显示热门技术

草料,显示当前页面为二维码
