Vue.js+Brunch:你渴望的Webpack替代品

智能甄选 2018-02-04 11:21:27

如果你正在寻找一个Webpack的替代构建工具,可以让你更少的代码(和一些伟大的brunch双语)阅读!

想象一下,如果有一个构建工具可以用于比Webpack编译速度更快的Vue.js项目,那么给你一个更小的bundle大小,只需要几行配置。

​brunch就是这个工具。在本文中,我将向您展示如何设置Vue.js + Brunch项目,介绍Brunch的一些优缺点,并在途中提供一些美味的brunch。

为了激起你的胃口,请看看这个简单的Vue.js项目的Webpack配置和Brunch配置的并行比较:

注意:这篇文章最初是在2017/08/20的Vue.js Developers博客上发布的

Webpack Blues

Webpack是构建复杂,高度优化的Web应用程序的重要工具,受到许多有影响力的Web开发人员的鼓励。

然而,对于较新的开发人员或那些从事不那么雄心勃勃的项目的人来说,Webpack大多是作为障碍出现的。对于Vue.js项目,用户觉得他们必须选择在低保真ES5环境中开发,而不需要像单文件组件这样的酷功能,或者在高度复杂的环境中开发,在构建配置上花费的时间与在应用程序开发上花费的时间。

为brunch腾出空间

Brunch早在2012年就已经出现,虽然它是Phoenix Elixir框架的默认构建工具,但它仍然令人惊讶地模糊。也就是说,它拥有一群热衷于“简单和快速”的核心理念的用户群,这是Vue.js用户可以认同的。

尽管模糊不清,但对于大多数可以想象的自动化来说,几乎有80个社区制作的插件,例如transpiling,linting,optimize等等。Brunch可以完成Vue项目中大部分需要的事情:将文件作为模块包装,并将它们连接成编译Vue文件,编译JS和SASS等。

明确的说,Brunch并不像Webpack那样功能全面,而且有一定的局限性。例如,Brunch尚不支持动态导入,并且不处理图像和字体。

约定通过配置

brunch的一个明确的特点是它是自以为是,并赞成约定而不是配置。如果您愿意将您的项目构建为“brunch方式”,并且您对大多数插件的标准设置感到满意,那么您可能只需要少量几行配置即可完成令人惊讶的复杂构建。

以预编译SASS为例。使用Webpack,每个项目都必须声明将要处理的文件类型的加载器。典型的SASS配置是这样的:

webpack.config.js

module.exports = {  ...  module: {    rules: [{      test: /\.scss$/,      use: [{        loader: "style-loader"      }, {        loader: "css-loader"      }, {        loader: "sass-loader"      }]    }]  }};

但是,使用brunch,您只需安装brunch SASS插件即可。brunch会扫描你的package.json,当一个构建被触发,并且,看到你已经安装了插件,将完全照顾它。

brunch口味测试

想知道Brunch可以做什么,我已经使用Vue CLI webpack-simple项目模板安装了一个Vue.js项目。在用Webpack构建样板代码后,我得到这个:

我现在将这个项目迁移到Brunch,并尝试重新创建与Webpack相同的构建特性和过程,以突出显示任何相似性和差异。

随意从这个回购下载完成的代码,并按照。

安装

和Webpack一样,最好在全局安装Brunch,这样Brunch CLI可以从任何地方运行。

$ npm i -g brunch

并且在本地安装:

$ npm i --save-dev brunch配置

Brunch有一个类似于Webpack的声明式配置。以下是让Brunch运行的最小配置。目前,所有它的作用就是模块化,并在表目录中的任何JavaScript文件串接到输出文件app.js。

早午餐config.js

module.exports = {  files: {    javascripts: {      joinTo: 'app.js'    }  }};

与Webpack不同,Brunch不需要输入文件。你有一个监视目录,如果可能的话,Brunch会简单地处理每个文件。

尽管失去了双赢的机会,Brunch中的默认监视目录是app,而不是src。在这个项目中使用应用程序将利用Brunch的最小配置,所以我将把所有的项目文件移动到那里:

$ mv src app建立

完成后,我可以运行第一个构建:

$ brunch build

这导致这个令人愉快的简短的输出消息:

14:32:19 - info: compiled main.js into app.js, copied logo.png in 466 ms

并创建一个新的公共目录,其中包含以下构建文件:

public  - app.js  - app.js.map  - logo.pngJavaScript构建文件

检查主要的JavaScript构建文件public / app.js,前149行是Brunch引导代码,将在每个构建中。之后是来自main.js的代码,watch文件夹中唯一的JavaScript文件:

require.register("main.js", function(exports, require, module) {  import Vue from 'vue'  import App from './App.vue'  new Vue({    el: '#app',    render: h => h(App)  })});

brunch已经将main.js包装为CommonJS模块。它没有导入Vue或App.vue,但没有转换到ES5。我们需要一些额外的插件来完成这些任务。

资产

Brunch的另一个约定是,任何名为资产的目录都将被递归复制到公共文件夹中,而不需要任何处理,这就是为什么您在输出中看到了logo.png的原因。

早午餐不像Webpack那样加载图像或字体文件,所以复制到输出文件夹可能是最好的选择。

插件

为了处理项目文件,我需要添加一些插件到Brunch。有ES6代码以及Vue文件,其中包括SASS,所以我会为这些文件类型安装适当的插件:

$ npm i --save-dev babel-brunch babel-preset-es2015 vue-brunch sass-brunch

我还安装了babel-preset-es2015,以便使用浏览器友好的JavaScript。我需要更新.babelrc文件来表明这一点,因为Webpack有一个更复杂的方法来知道为什么构建环境:

.babelrc

{  "presets": [    [ "es2015" ]  ]}

令人惊讶的是,所有这些都是必需的。当我再次建立我得到这个输出:

15:05:57 - info: compiled 4 files into app.js, copied logo.png in 1.5 sec

再次检查构建文件public / app.js,有更多的代码。这是因为Brunch在main.js中编译了ES6 ,发现了Vue的依赖,并添加了这个,并且还处理并导入了App.vue。

Brunch如何做到这一点没有任何配置?它在package.json的依赖中看到了这些插件,只是用默认设置注册它们。

服务brunch

我已经建立了所有的项目代码,所以现在是时候去浏览器,看看我有什么。

像Webpack一样,Brunch有一个内置的开发服务器,可以用来为项目提供服务。它也将观察任何文件的变化,并自动建立变化(也可以非常快,我可以添加)。

在我运行服务器,不过,我会移动的index.html的资产  ,因此被复制到该目录中的公共文件夹,可作为良好:

$ mv index.html ./app/assets

我现在可以运行服务器:

$ brunch watch --server

我看到这个终端输出:

15:16:40 - info: application started on http://localhost:3333/15:16:40 - info: compiled 4 files into app.js, copied 2 in 1.7 sec调用main.js

当我检查浏览器,但是,我得到的只是一个空白的屏幕。问题在于,由于没有指定条目文件,因此项目不会像Webpack那样运行。入口文件必须手动调用。

请记住,Brunch将所有文件包装到输出中的CommonJS模块中,如下所示:

require.register("main.js", function(exports, require, module) {  // Contents of main.js}

惯例是该模块是通过文件名减去扩展名来命名的,所以main.js只是主要的。脚本下载后,我需要在index.html中调用该模块:

app/assets/index.html

<body>  <div id="app"></div>  <script type="text/javascript" src="/app.js"></script>  <script type="text/javascript">require('main');</script></body>vue-brunch

好吧,几乎在那里。刷新浏览器,我得到这个错误:

Uncaught Error: Cannot find module 'vueify/lib/insert-css' from 'App.vue'

这是因为Brunch插件API不像Webpack那么强大,并且能够在运行时内联CSS,所以vue-brunch需要vueify-insert-css模块可用。

这将需要在main.js的顶部导入:

import 'vueify/lib/insert-css';

完成之后,我又一次发挥了Vue的功能:

生产选项

然而,在我将Brunch的方法与Webpack进行比较之前,我还需要设置一些生产优化来确保两种方法都能生成相同的输出。

Webpack有一个配置选项来自动关闭烦人的开发模式消息。据我所知,Brunch无法做到这一点,所以在导入Vue之后,我不得不将这一行添加到main.js中:

main.js

import Vue from 'vue';Vue.config.productionTip = false;

我也想uglify JavaScript构建文件,所以它很好,紧凑。我会brunch-uglify-js为此安装:

$ npm i --save -dev brunch-uglify-js

正如你所猜测的,不需要进一步的配置。我所要做的只是在生成时将-p(生产)开关添加到Brunch命令,并且输出将被忽略。

$ brunch build -p

易如反掌!

对照

我现在已经用Brunch 成功地取代了webpack-simple的构建功能。现在我们来比较一下配置文件的差异。

首先,Webpack:

webpack.config.js

var path = require('path')var webpack = require('webpack')module.exports = {  entry: './src/main.js',  output: {    path: path.resolve(__dirname, './dist'),    publicPath: '/dist/',    filename: 'build.js'  },  module: {    rules: [      {        test: /\.vue$/,        loader: 'vue-loader',        options: {          loaders: {            // Since sass-loader (weirdly) has SCSS as its default parse mode, we map            // the "scss" and "sass" values for the lang attribute to the right configs here.            // other preprocessors should work out of the box, no loader config like this necessary.            'scss': 'vue-style-loader!css-loader!sass-loader',            'sass': 'vue-style-loader!css-loader!sass-loader?indentedSyntax'          }          // other vue-loader options go here        }      },      {        test: /\.js$/,        loader: 'babel-loader',        exclude: /node_modules/      }    ]  },  resolve: {    alias: {      'vue: 'vue/dist/vue.esm.js'    }  },  devServer: {    historyApiFallback: true,    noInfo: true  },  performance: {    hints: false  },  devtool: '#eval-source-map'}if (process.env.NODE_ENV === 'production') {  module.exports.devtool = '#source-map'  // http://vue-loader.vuejs.org/en/workflow/production.html  module.exports.plugins = (module.exports.plugins || []).concat([    new webpack.DefinePlugin({      'process.env': {        NODE_ENV: '"production"'      }    }),    new webpack.optimize.UglifyJsPlugin({      sourceMap: true,      compress: {        warnings: false      }    }),    new webpack.LoaderOptionsPlugin({      minimize: true    })  ])}

(请注意,以上没有file-loader配置,因为在brunch中无法完成)。

而现在,brunch:

brunch config.js

module.exports = {  files: {    javascripts: {      joinTo: 'app.js'    }  }};

正如你所看到的,如果按照其惯例,Brunch需要的配置少得多。公平地说,在Brunch中,我不得不在main.js中添加两行代码,并在index.html中增加一行以获得等效的功能。

基准

那尺寸和性能呢?比较两种工具的生产版本:

令人惊讶的是,brunch的捆绑规模较小,编译速度比Webpack快3倍以上。

结论

我认为brunch是简单的VUE项目的一个很好的选择。这不仅更容易设置,而且速度更快,而且对于这个用例,提供了一个更小的包文件。

但是,这并不意味着Brunch普遍比Webpack for Vue.js项目更好。brunch不能做的事情有很多,例如,动态进口,这对于建立PWA是必不可少的。

重点是虽然Webpack确实有它的地位,Brunch也应该如此。

做自己的brunch

就像使用Vue CLI一样,您可以创建Brunch项目骨架。我建议你先尝试一下brunch-vue-barebones,它与我设置的非常相似。

0 阅读:0
智能甄选

智能甄选

技术交流、资源共享,是程序员的网上乐园。