资讯专栏INFORMATION COLUMN

webpack2-update之路

elva / 3036人阅读

摘要:重要特性枚举特性增加了对特性的支持。重要特性另一个就是基于静态模块分析仅支持标准写法。这样之后整体只能通过的方式。另外在使用过程中默认是将和转为所以需要关闭预设功能。这样做的目的就是为了项目工程化实现大项目的分工协作提高开发效率。

引言

这里是webpack official提供的一到二的升级指南,二兼容一的写法,给我的感觉是二的写法更规范,使用起来也比较简洁。

重要特性枚举 特性1

webpack2增加了对es6特性的支持。支持import和export写法。之前需要通过babel来弄这个。

重要特性tree-shaking(另一个就是rollup),基于es6静态模块分析(仅支持标准写法)。大致原理就是通过分析js的AST,依赖检查等步骤,建立一个"对象依赖树",从而将被使用和被引用的的
对象抽出,合成最小可用程序集。

export function A() {

}
export function B() {

}
export default {
    "A":A,
    "B":B,
}

上面是反模式写法,相当于export default是把后面变量先赋值给default在输出,输出的是对象,没法利用ES6模块系统的多输入多输出特性。

正规写法,分别输出。这样之后整体import只能通过import * as XXX的方式。

// export {
//     "A":A,
//     "B":B,
// }

做了个demo (case1),实验结果如下,效果还是比较明显的。

说一下应用场景,由于有些第三方库,是编译好的commonjs格式,虽然可以模块化引入加载,但是没法tree-shaking,除非你有未编译的es6 source。
另外在使用过程中,babel 默认是将import和export转为require,所以需要关闭预设功能。

["env", {"modules": false}]

另外我想说的在做这个demo工程中,发现开启tree-shaking后会标记无用代码,但是不会删除,要做到真正的DCE,还需要进行Uglify处理。

第二个应用场景就是有利于组件化开发,下面这个截图中是平时使用到的vue component,每个component集成了html、js、css。可以作为多带带组件存在,
这些组件既具有重用性,同时也可以利用es6的模块化机制结合webpack2,实现组件之间的依赖。这样做的目的就是为了项目工程化,实现大项目的分工协作,提高开发效率。

特性2

loaders改名为rules,且写loader时不能缺少后缀, 针对loader增加option参数。提倡这样做。

options: {
                cacheDirectory: true,
                presets: [
                    ["es2015", {modules: false}] 
                ]
            }

旧版loader连接器写法

loader: "style-loader!css-loader!less-loader"。

下面是我项目中的写法,之前还遇到个坑,最后那一项拆开了就error了,这种写法没条理性,不易阅读,不推荐。

 { test: /.styl$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader!stylus-loader") }

新webpack2连接器写法,非常好,简介明了。

use: [
"style-loader",
"css-loader",
"less-loader"
]

特性3

resolve.extensions配置项将不再要求强制转入一个空字符串,下面是我使用的配置。

resolve: {
        extensions: [".js", ".css",".sass", ".scss", ".less",  ".vue"],
    },

原先的话第一个为空,现在被移动到resolve.enforceExtension。

特性4

json-loader在2中已经内置,读取json文件不用加loader。
取消module.preLoaders,具体用法如下所示

 preLoaders: [{
         test: /.js$/,
         loader: "eslint-loader",//webpack1写法
         exclude: /node_modules/
         }]
-------------------------------------------------         
        rules: [{
            test: /.js$/,
            loader: "eslint-loader",
            exclude: /node_modules/,
            enforce: "pre" //webpack2写法
        }      
特性5

1系列的ExtractTextPlugin不兼容wp2,需多带带安装ExtractTextPlugin的v2版本

module: {
  rules: [
    {
      test: /.css$/,
-      loader: ExtractTextPlugin.extract("style-loader", "css-loader", { publicPath: "/dist" })
+      use: ExtractTextPlugin.extract({
+        fallback: "style-loader",
+        use: "css-loader",
+        publicPath: "/dist"
+      })
    }
  ]
}
--------------------------------------------------------------------------------------------------
plugins: [
-  new ExtractTextPlugin("bundle.css", { allChunks: true, disable: false })
+  new ExtractTextPlugin({
+    filename: "bundle.css",
+    disable: false,
+    allChunks: true
+  })
]
tips

在写这个的过程中写了个脚手架基于webpack2,自己以后项目开发打算就基于这个,还需要完善。

在写这个过程中遇到几个问题:

http://yeoman.io/generators/ 显示不出来,说是one hour synchronize可是超过了一个小时还是没看到。
在此的建议就是直接install yo一下试试看能不能用,不要干等着

npm run start而不是直接webpack-dev-server,前者基于当前package.json中的版本,后者是基于系统版本。

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

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

相关文章

  • webpack源码之tapable

    摘要:它的行为和的方法相似,用来注册一个处理函数监听器,来在信号事件发生时做一些事情他最终还是调用进行存储。而就全部取出来执行。总结上面这些知识是理解插件和运行原理的前置条件更多内容待下次分解参考源码版本说明参考链接 引言 去年3月的时候当时写了一篇webpack2-update之路,到今天webpack已经到了4.2,更新挺快的,功能也在不断的完善,webpack4特性之一就是零配置, w...

    Keagan 评论0 收藏0
  • php底层原理之变量(二)

    摘要:但是对于结构体中的和字段我们一直都没有详细介绍过,而这两个字段其实是和变量之间赋值的原理有着密切的关系的。 上周我们从底层的角度介绍了php变量从生成->常量赋值->销毁的完整生命周期(不了解的同学可以翻看一下前面的文章php底层原理之变量(一)),但是我们留了一个思考,不知道大家有答案了没,变量之间的赋值在底层又是如何实现的呢? 变量之间赋值 php变量的zval结构,我们已经介绍了...

    bladefury 评论0 收藏0
  • php底层原理之垃圾回收机制

    摘要:总结垃圾回收机制以的引用计数机制为基础以前只有该机制同时使用根缓冲区机制,当发现有存在循环引用的时,就会把其投入到根缓冲区,当根缓冲区达到配置文件中的指定数量后,就会进行垃圾回收,以此解决循环引用导致的内存泄漏问题开始引入该机制 php垃圾回收机制,对于PHPer来说是一个不陌生但是又不是很熟悉的内容。那么php是怎么实现对不需要的内存进行回收的呢? php变量的内部存储结构 首先还是...

    light 评论0 收藏0

发表评论

0条评论

elva

|高级讲师

TA的文章

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