WebPack基础篇


​ 主要在实战上,可能对于概念讲解上不太多,如果有需要的同学可以自己看下官方文档

​ webpack2发布也有了大半年,最近也刚开始接触webpack2的升级工作,从webpack1开始我就没有好好耍,突然一下子弄webpack2还是有点小小的激动的,废话不多说开始讲下我升级的一些方法和技巧。

​ 我们首先需要看官网上推荐的升级文档,这里很详细的介绍了Migrating,但我觉得这文档还有好多地方需要补充的,也是后来结合实际的开发中所遇到的问题。

​ 接下来我先讲下webpack大体的结构,因为有些同学可能对webpack还不太了解,有entry,output,loaders,plugins,大体一个配置文件由4个部分组成,接下来我就会从这4个部分来展开分享,我会以每块区域先讲概念,然后会留下一些问题的方式给大家,最后再来解答的形式来讲解。

接下来的要打起精神哟!

因为实在挺重要的    > ^_^ <

因为实在挺重要的    > ^_^ <

因为实在挺重要的    > ^_^ <

重要的说三遍

Entry

​ 它就是一个入口文件,也就是告诉webpack该从哪个文件着手去解析,然后entry的配置一般常用的就是多入口

entry: {home: "./home.js",about: "./about.js",contact: "./contact.js",vendor: ['react','react-dom']}

上面就代表了三个入口,分别是Home,About,Contact,分别对应三个js,一般入口可以对应路由组件里的map,其次还有一种情况是针对于第三方的vendor处理,将第三方的lib打包在vendor里,这里会涉及到一个内容叫Code Split,后面我会讲到,大家可以先简单理解成这块的处理就是为了将第三方的lib放一起,利用浏览器缓存来缓存文件。

Output

​ 既然前面提到了输入,那肯定会有对应的输出,这里output就是对应的输出属性。

output: {path: '/home/proj/public/assets',publicPath: '//cdn.com',filename: 'js/[name]-[chunkhash:8].js'chunkFilename: 'js/[name]-[chunkhash:8].js',}

path 代表的就是文件给输出的目录,publicPath 代表的就是上线后cdn所对应的路径,filename 代表的就是输出的文件名字,由name 和 chunkhash 前8位组成,chunkFilename 代表的就是 chunk 出来的名字。

Loaders

​ Loaders就是加载器,它主要的作用的处理静态文件的,你可以想象成流水线上不同的商品的处理机器,它会流程化的去处理这些文件

module: {rules: [*****loaders,*****loaders*****]}

常用的loaders:

eslint-loader

{enforce: "pre",test: /\.(js|jsx)$/,loader: "eslint",include: [path.resolve(CWD, config.base)],exclude: /node_modules/,options: {configFile: path.resolve(CWD, '.eslintrc'),}}

​ eslint 是需要enforce: "pre" 为preLoader(webpack1) 就是预加载器,可以在编译前对代码进行eslint检测

babel-loader

{test: /\.jsx?$/, // .jsx or .js filesloader: 'babel',query: require('./babel.prod'),exclude: /node_modules/,include: CWD},

​ 主要是对js或者jsx语法进行编译,一般是将es6转为 es5,可以通过query方式传递babel config, 然后exclude, include来执行对应的模块。

​ 这里值得注意注意注意的是query的这种传参方式可以让我们灵活去处理dev与pro环境下的babel编译处理,另外,如果你的开发环境是chrome等现代浏览器,原生就已经支持ES6的大部分特性,就可以在开发时去掉大部分的preset和plugin,只保留babel-preset-react等浏览器无法支持的预设,以提升编译速度,上线时再加上剩余的babel转换。

css-loader

less-loader

sass-loader

这三个loader主要是处理样式的,这里我就结合我们的项目讲下sass-loader

{test: /\.scss$/,exclude: [path.resolve(CWD, config.base, config.scss)],// pack other styles into JS and wrapped within style at runtimeuse: ['style',{loader: 'css',options: config.css_modules ? {modules: true,importLoaders: 1,localIdentName: '[name]__[local]__[hash:base64:8]',}: {},},'postcss','resolve-url',{loader: 'sass',options: {sourceMap: true,includePaths: [path.resolve(CWD, 'node_modules'), path.resolve(CWD, config.base)]}}]}

​ 这个配置比较全,也比较长,我会一一讲解的。

​ 首先这里需要注意的是use:[] 这种写法,这其实是chainsLoader, 在webpack1 和 webpack2 写法上是不同的,这里有对应的文档参考,然后可以看到 use 这个数组里有 style-loader,css-loader,postcss-loader,resolve-url-loader,sass-loader。

style-loader:主要做的事情就是帮你去内敛css到页面里。

css-loader: 这里可以看到我们有个config.css_modules的一个配置项,作用就是是否开启css modules的语法糖,不了解css modules的同学可以自己google下,然后在css-loader里可以看到三个参数,第一个是modules代表是否开启,第二个参数importLoader可以先过我后面会讲,第三个参数localIdentName就是css modules后标签对应的规则。

postcss-loader: 在这里我们postcss-loader主要的作用是autoprefixer, 加浏览器前缀兼容各种版本的浏览器。

resolve-url-loader: 这里其实配合sass-loader来使用的,当使用sass-loader的时候需要使用resolve-url-loader来找到对应的url资源。

sass-loader: sass的加载器,处理sass的,这里的参数sourceMap非常重要,切忌不要掉了,不然你的图片对应的路径是无法编译出来的,以前我们在处理图片的时候可能是这样处理的 ~assets/images/test.png , 利用 ~ 处理绝对路径,然后现在有sourceMap后,你可以去处理相对路径的图片,这种相对路径就需要与你的 resolve 这个属性下的root 来匹配,resolve 后面我会好好讲讲,现在你只需要记着图片也可以通过相对路径处理。

svg-loaderhttps://github.com/SamHerbert/SVG-Loaders

url-loaderhttps://github.com/webpack-contrib/url-loader

file-loaderhttps://github.com/webpack-contrib/file-loader

json-loaderhttps://github.com/webpack-contrib/json-loader

这些loader 比较简单所以贴了github地址大家可以自己去学习。

常用的Loader就是这些了,提完loader,不得不讲下跟loader相关的一个东西,那就是 resolveLoader属性

resolveLoader: {modules: [path.resolve(__dirname, '..', '..', 'node_modules'),],/***  Automatic -loader module name extension removed*  https://webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removed*/moduleExtensions: ["-loader"]},

第一个参数是modules,主要是针对loader的引用路径,第二个参数则是可以省略loader的写法的,上面的loader,我都没在后面写*-loader , 就是因为加了这个东西,如果不加的话你就得写全不然就报错了~~~。

Plugins

常用插件

插件名功能

HotModuleReplacementPlugin模块热替换用的,主要是在dev环境下

DefinePlugin定义一些变量,在编译的时候会把这些变量给编译成定义的值

CommonsChunkPlugin主要是为了合并公共chunk的插件

ProvidePlugin定义一个变量让你能在代码里使用,但全局无法访问,比如jquery

UglifyJsPlugin压缩和混淆代码用的

ExtractTextPlugin主要是为了抽离css合并成一个文件

HtmlWebpackPlugin模板生成引擎,语法类似artTemplate

LoaderOptionsPlugin让webpack2结构更加严谨,避免webpack1中的自定义插件,尽量使用options来传递参数

Question:

1. 为什么vendor要用数组写,这样写是什么意思?​2. 官网上提供了 id,name,hash,chunkhash , 为什么要这样写,这样写有什么好处,它们的区别是什么?​3. postcss-loader 为什么不处理变量逻辑?​4. importLoader 到底是做什么用的?​5. use 里的 loader 顺序能随便写吗?

答案我会在后期补充~^_^

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

推荐阅读更多精彩内容