如何打造一个令人愉悦的前端开发环境(二)

前情提要

上一篇文章介绍了目前前端比较流行的各种编辑器,以及各种流行的打包方式,最后给了一个Gulp的例子,这个例子还是14年的时候写的,还有一些可以优化的空间,就不讨论了,这篇文章主要讲目前火热的打包构建方式--Webpack的使用方式。

主菜--没有开胃汤

其实Webpack的入门指导文章非常多,配置方式也各有各样,这里我推荐题叶大神的入门级指南--Webpack 入门指迷,如果不知道Webpack是什么或者不是很清楚各项配置含义的开发者,可以看此文章扫扫盲。毕竟我这篇文章并不是特别基础。

一、base.js

var path = require(‘path‘)
var baseConfig = {
    resolve: {
        extensions: [‘‘, ‘.js‘],
        fallback: [path.join(__dirname, ‘../node_modules‘)],
        alias: {
            ‘src‘: path.resolve(__dirname, ‘../src‘),
            ‘assets‘: path.resolve(__dirname, ‘../src/assets‘),
            ‘components‘: path.resolve(__dirname, ‘../src/components‘)
        }
    },
    module: {
        loaders: [{
            test: /\.js$/,
            loader: ‘babel‘,
            exclude: /node_modules/
        }, {
            test: /\.(png|jpe?g|gif|svg|woff2?|eot|ttf|otf)(\?.*)?$/,
            loader: ‘url?limit=8192&context=client&name=[path][name].[hash:7].[ext]‘
        },
        {
            test: /\.css$/,
            loader: ‘style!css!autoprefixer‘,
        },
        {
            test: /\.scss$/,
            loader: ‘style!css!autoprefixer!sass‘
        }]
    }
};

module.exports = baseConfig;

解读下这个基本配置:

1、resolve 解析模块依赖的时候,受影响的配置项。

  • extensions 决定了哪些文件后缀在引用的时候可以省略点,Webpack帮助你补全名称。
  • fallback 当webpack在 root(默认当前文件夹,配置时要绝对路径) 和 modulesDirectories(默认当前文件夹,相对路径)配置下面找不到相关modules,去哪个文件夹下找modules
  • alias 这个大家应该比较熟悉,requirejs之类的都有,就是别名,帮助你快速指向文件路径,少写不少代码,而且不用关心层级关系,需要注意的是:在scss之类的css预编译中引用要加上~,以便于让loader识别是别名引用路径。

2、module 解析不同文件使用哪些loader,这个比较简单,很多文章都有,就不多说了,注意的是,这里的scss可以换成你自己的预编译器,例如:sass、less、stylus等,或者直接用postcss都行,当然还可以用一种通用方法,后面补上。

二、开发环境配置--config

var webpack = require(‘webpack‘);
var path = require(‘path‘)
var merge = require(‘webpack-merge‘)
var baseConfig = require(‘./webpack.base‘)
var getEntries = require(‘./getEntries‘)

var hotMiddlewareScript = ‘webpack-hot-middleware/client?reload=true‘;

var assetsInsert = require(‘./assetsInsert‘)

module.exports = merge(baseConfig, {
  entry: getEntries(hotMiddlewareScript),
  devtool: ‘#eval-source-map‘,
  output: {
    filename: ‘./[name].[hash].js‘,
    path: path.resolve(‘./dist‘),
    publicPath:‘./dist‘
  },
  plugins: [
    new webpack.DefinePlugin({
      ‘process.env‘: {
        NODE_ENV: ‘"development"‘
      }
    }),
    new webpack.optimize.OccurenceOrderPlugin(),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoErrorsPlugin(),
    new assetsInsert()
  ]
})

说说这个配置中的一些难点:

1、getEntries 是用来配置入口文件,一般很多人是自己手写,或者SPA页面,只有一个入口, 很容易就写出来,但是公司中,很多情况,是需要多入口,也就是多路由的Url,这个时候入口的配置就比较麻烦,我这里是放单独一个文件里面配置,我们公司是靠规定来执行,也就是一个文件夹所有的main.js都认为是入口文件,其他都忽略。

function getEntry(hotMiddlewareScript) {
    var pattern = paths.dev.js + ‘project/**/main.js‘;
    var array = glob.sync(pattern);
    var newObj = {};

    array.map(function(el){
        var reg = new RegExp(‘project/(.*)/main.js‘,‘g‘);
        reg.test(el);
        if (hotMiddlewareScript) {
            newObj[RegExp.$1] = [el, hotMiddlewareScript];
        } else {
            newObj[RegExp.$1] = el;
        }
    });
    return newObj;
}

2、assetsInsert 是用来做模板替换的,一个小插件把template里面的值替换成打包后的css或者js。

三、打包环境配置--production

var webpack = require(‘webpack‘);
var path = require(‘path‘)
var merge = require(‘webpack-merge‘)
var baseConfig = require(‘./webpack.base‘)
var getEntries = require(‘./getEntries‘)
var ExtractTextPlugin = require(‘extract-text-webpack-plugin‘);
var assetsInsert = require(‘./assetsInsert‘)

var productionConf = merge(baseConfig, {
    entry: getEntries(),
    output: {
        filename: ‘./[name].[hash].js‘,
        path: path.resolve(‘./public/dist‘),
        publicPath: ‘./‘
    },
    plugins: [
        new webpack.DefinePlugin({
            ‘process.env‘: {
                NODE_ENV: ‘"production"‘
            }
        }),
        new ExtractTextPlugin(‘./[name].[hash].css‘, {
            allChunks: true
        }),
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            }
        }),
        new webpack.optimize.OccurenceOrderPlugin(),
        new assetsInsert()
    ]
})

productionConf.module.loaders = [
             {
                test: /\.js$/,
                loader: ‘babel‘,
                exclude: /node_modules/
            }, {
                test: /\.(png|jpe?g|gif|svg|woff2?|eot|ttf|otf)(\?.*)?$/,
                loader: ‘url?limit=8192&context=client&name=[path][name].[hash:7].[ext]‘
            },
            {
                test: /\.css$/,
                loader: ExtractTextPlugin.extract(‘style‘, ‘css‘),
            },
            {
                test: /\.scss$/,
                loader: ExtractTextPlugin.extract(‘style‘, ‘css!sass‘)
            }]

module.exports = productionConf

基本跟开发的差不多,差别在于:
1、使用ExtractTextPlugin 来打包css,所以要干掉原来base的loaders,重新写了一个,在最下面。

2、UglifyJsPlugin 给js压缩代码。其他没有什么好解释的了,一样的。

四、构建命令

require(‘shelljs/global‘)
env.NODE_ENV = ‘production‘
var ora = require(‘ora‘)
var webpack = require(‘webpack‘)
var webpackConfig = require(‘./webpack.production.config‘)

var spinner = ora(‘building for production...‘)
spinner.start()

var staticPath = __dirname + ‘/../public/dist/‘
rm(‘-rf‘, staticPath)
mkdir(‘-p‘, staticPath)

webpack(webpackConfig, function (err, stats) {
  spinner.stop()
  if (err) throw err
  process.stdout.write(stats.toString({
    colors: true,
    modules: false,
    children: false,
    chunks: false,
    chunkModules: false
  }) + ‘\n‘)
})

写一个build.js,然后在package.json里面添加 script 参数


"build": "node build.js"//这里记得写自己build.js路径

甜点(马卡龙)--有点腻

上面的配置是可以更改的,例如你在loaders 里面加上


{
  test: /\.vue$/,
  loader: ‘vue‘
}

就可以变成支持.vue文件的vuejs打包构建,同理,修改下支持jsx,和添加一些reactjs的module,就可以用来跑Reactjs的东西。

还有可以随意更改Css预编译器的类型,用你自己喜欢就行,或者跟我们前面提到的方法,把所有类型都配置上,

var path = require(‘path‘)
var config = require(‘../config‘)
var ExtractTextPlugin = require(‘extract-text-webpack-plugin‘)

exports.assetsPath = function (_path) {
  return path.posix.join(config.build.assetsSubDirectory, _path)
}

exports.cssLoaders = function (options) {
  options = options || {}
  // generate loader string to be used with extract text plugin
  function generateLoaders (loaders) {
    var sourceLoader = loaders.map(function (loader) {
      var extraParamChar
      if (/\?/.test(loader)) {
        loader = loader.replace(/\?/, ‘-loader?‘)
        extraParamChar = ‘&‘
      } else {
        loader = loader + ‘-loader‘
        extraParamChar = ‘?‘
      }
      return loader + (options.sourceMap ? extraParamChar + ‘sourceMap‘ : ‘‘)
    }).join(‘!‘)

    if (options.extract) {
      return ExtractTextPlugin.extract(‘vue-style-loader‘, sourceLoader)
    } else {
      return [‘vue-style-loader‘, sourceLoader].join(‘!‘)
    }
  }

  // http://vuejs.github.io/vue-loader/configurations/extract-css.html
  return {
    css: generateLoaders([‘css‘]),
    postcss: generateLoaders([‘css‘]),
    less: generateLoaders([‘css‘, ‘less‘]),
    sass: generateLoaders([‘css‘, ‘sass?indentedSyntax‘]),
    scss: generateLoaders([‘css‘, ‘sass‘]),
    stylus: generateLoaders([‘css‘, ‘stylus‘]),
    styl: generateLoaders([‘css‘, ‘stylus‘])
  }
}

// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
  var output = []
  var loaders = exports.cssLoaders(options)
  for (var extension in loaders) {
    var loader = loaders[extension]
    output.push({
      test: new RegExp(‘\\.‘ + extension + ‘$‘),
      loader: loader
    })
  }
  return output
}

这就是把所有的css预编译的都加到配置里面了。

总结下--买单啦

Webpack多种多样,就算一个loaders都有好几种不同的配置,让人很是头疼,最关键的是很多插件自己的文档也不清不楚,弄得大家都很迷茫,我的经验就是多试多测,自己多写一写,看命令行打印的错误,去找原因,不要一看到报错就慌了,很多新手最容易犯错就是一看到报错就怀疑人生了,一定要看报错记录,一般都有提示,按照提示去解决相应问题就好啦。

下一章我们讲Nodejs的东东。

原文地址:https://www.cnblogs.com/10manongit/p/12620043.html

时间: 2024-10-08 08:23:15

如何打造一个令人愉悦的前端开发环境(二)的相关文章

如何打造一个令人愉悦的前端开发环境(一)

文章来源 最近几年,前端发展越来越迅速,各种萌新加入了前端这个大家庭,大有赶IOS.超Android的趋势呀!同时,萌新们提出了各种前端工作问题,除了最基础的html.css.js三板斧之外,最让人头疼的应该是关于环境的配置问题,所以以环境作为切入点,开始一系列的前端开发环境配置文章. 主要会涉及到打包.构建.编程工具.debug等等前端环境,以及前后端分离.Nodejs中间层使用伸展面. 工欲善其事必先利其器 以编程工具而言WebStorm.sublime.Atom.VS Code.Brack

如何打造一个"逼格"的web前端项目

最近利用空余的时间(坐公交车看教程视频),重新了解了前后端分离,前端工程化等概念学习,思考如何打造一个"逼格"的web前端项目. 前端理论篇 前端代码规范:制定前端开发代码规范文档. PS:重中之中,为了下一步实现前端工程化. 编码风格有很多.团队代码规范一定要统一.便于维护web项目.     接口文档规范:制定RESTful架构接口规范文档. PS:果断使用用apiDoc构建API文档.美观好看,易于维护. 还用Word或者Excel写文档,太low了. 前后端分离:简单理解为前端

Flux是一个Facebook团队的前端开发架构

Flux introduction 本文组成: React 官方文档翻译 相关实践心得. 内容上是Flux的介绍,例子将会在以后写出.一旦稍微多了解一点React,很难避免听到Flux这个名词.Flux是一个Facebook团队的前端开发架构.借助单向数据流等其它机制,使得React可以发挥了更加强大的功能.比起其它的框架,Flux更像是一种模式,我们可以投入较少的学习成本,快速上手Flux. Flux应用有三个主要的组成部分:调度者(dispatcher), 仓库(stores),视图(vie

【前端福利】用grunt搭建自动化的web前端开发环境-完整教程

jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过.但是不会熟练使用grunt,那你就真的真的真的out了(三个"真的"重复,表示重点).至于grunt的作用,这里不详细说了,总之你如果做web前端开发,你一定要用grunt.还有一点,它完全免费,没有盗版.既强大又免费的东西,为何不用? 当然了,你如果你能找到更好的替代grunt的其他工

打造理想的Windows 10 APP开发环境的5个步骤

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软即将发布Windows 10手机版,实际上很多人现在已经开始在开发Windows 10 APP了.今天推荐的文章简单介绍了如何搭建一个理想的开发环境. 周末一个大学同学到访成都,所以停更了2天.今天时间也不多,就推荐一个简单的文章,作者Michael Crump在这篇文章中分享了如何打造理想的Windows 10 APP开发环境的5个步骤. 分别是: 安装一个干净的系统.要更好的使用Win

Web 前端开发环境

创建 Web 前端开发环境 Web 前端开发涉及多种工具,这里将常用工具的安装和配置进行说明,提供了详细的说明,为后继的开发创建一个坚实的基础. 本文介绍的工具有:NodeJS, NPM, Bower, Git 和 Grunt. 1. 安装 NodeJS 和 NPM 一切从 NodeJS 开始吧,官方网址:https://nodejs.org/ NodeJS 既可以为我们提供一个服务器端的 Web 环境,又可以提供一个命令行的工具,既然做 Web 前端开发,那就是我们必然选择的工具了. 为了解决

用grunt搭建自动化的web前端开发环境

用grunt搭建自动化的web前端开发环境 jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过.但是不会熟练使用grunt,那你就真的真的真的out了(三个“真的”重复,表示重点).至于grunt的作用,这里不详细说了,总之你如果做web前端开发,你一定要用grunt.还有一点,它完全免费,没有盗版.既强大又免费的东西,为何不用? 当然了,你如果你

用grunt搭建自动化的web前端开发环境-完整教程

jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过.但是不会熟练使用grunt,那你就真的真的真的out了(三个“真的”重复,表示重点).至于grunt的作用,这里不详细说了,总之你如果做web前端开发,你一定要用grunt.还有一点,它完全免费,没有盗版.既强大又免费的东西,为何不用? 当然了,你如果你能找到更好的替代grunt的其他工具也是可以

在Mac OSX下设置前端开发环境

以下内容将会详细介绍本人在MAC OSX下关于前端开发环境的安装和设置,如果您是前端开发人员,并且手上有个全新的或者重新安装过系统的mac,你可能会在以下内容里发现你所需要的东西. Google Chrome 几乎是每个前端开发者必备的浏览器,下载地址: https://www.google.com/chrome 一些常用到得Chrome插件: [JSON Formatter(显示格式化过得JSON文件)](https://chrome.google.com/webstore/detail/js