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

前端学习123321123 前端学习123321123     2022-12-25     306

关键词:

前情提要

上一篇文章介绍了目前前端比较流行的各种编辑器,以及各种流行的打包方式,最后给了一个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的东东。

编辑器vscode的web前端(html,css,javascript)开发环境打造(代码片段)

1、安装VScode和浏览器VScode安装:https://code.visualstudio.com/Chrome安装:https://www.google.com/intl/zh-CN/chrome/node.js安装:https://nodejs.org/zh-cn/download/Web前端开发主要包括html,css࿰ 查看详情

波尔原子模型:一段令人愉悦的历史(代码片段)

波尔的原子理论  波尔的原子理论 01波尔原子模型BohrModel:ADelightfulHistory[CC]一、前言  尼尔斯·波尔在其晚年曾谈到, 直到1913年人们对于氢气燃烧的光线中的物理规律还是一无所知,尽管它的谱线满足一定的模式... 查看详情

riot.js教程简介

...令人愉悦的语法,优雅的API和非常小的体积;为什么需要一个新的界面库前端开发框架的确已经非常多了,但还是没有令人足够满意的东西,reactjs貌似是来解决问题的,但是用过的人都知道,它有很多令人不爽的弱点,我们相... 查看详情

打造超级舒适的go开发环境之vim配置(代码片段)

最近博主已经从VIM迁移到了EMACS作为主要生产工具,目的是为了学习Lisp和体验EMACS操作系统之美,哈哈,不要被我弄的技术焦虑,没错,我就是换了个吃饭的盘子。写下这篇博客也是为了纪念我顺利的“从VIM毕业了”。在阅读本... 查看详情

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

...,重新了解了前后端分离,前端工程化等概念学习,思考如何打造一个“逼格”的web前端项目。     前端理论篇    前端代码规范:制定前端开发代码规范文档。       &nb 查看详情

windows上使用vagrant打造laravelhomestead可协同跨平台开发环境

http://www.itkeyword.com/doc/38639940209225915181、简介Laravel 致力于让整个PHP开发过程变得让人愉悦,包括本地开发环境,为此官方为我们提供了一整套本地开发环境——Laravel Homestead。LaravelHomestead是一个打包好各种Laravel开发所需... 查看详情

利用windowshyper-v创建linux虚拟机,打造个人开发环境(代码片段)

静态IP#创建一个内部的虚拟机交换机(附带会创建一个虚拟网卡)New-VMSwitch-SwitchName"NAT-VM-CentOS"-SwitchTypeInternal#查看虚拟网卡NAT-VM的ifindexGet-NetAdapterGet-NetAdapter-Name"*NAT-VM-CentOS*"|Format-List-Property 查看详情

使用virtualbox+vagrant打造统一的开发环境(代码片段)

https://blog.csdn.net/openn/article/details/54927375配置步骤安装VirtualBox虚拟系统运行在VirtualBox中,类似的工具还有VMware,但后者是收费的。VirtualBox下载地址:https://www.virtualbox.org/wiki/Downloads.它支持多个平台,请根据自己的情况选择对应的... 查看详情

markdown有用的gulp插件的精选列表,用于令人敬畏和简单的前端web开发。(代码片段)

查看详情

基于react+如何搭建一个完整的前端框架(代码片段)

 1.使用create-react-app快速构建React开发环境  create-react-app是来自于Facebook,通过该命令我们无需配置就能快速构建React开发环境。  create-react-app自动创建的项目是基于Webpack+ES6。  执行以下命令创建项目:  $cnpminstall-g... 查看详情

在ubuntu上打造方便好用的python开发环境(代码片段)

http://blog.csdn.net/a464057216/article/details/52070922我使用的是Ubuntu14.04LTS,按照我的操作步骤做完,终端Terminal的使用效果如下:vim编辑Python文件时使用效果如下:安装oh-my-zshShell是Linux内核与用户通信的接口,种类很... 查看详情

使用vite和typescript带你从零打造一个属于自己的vue3组件库

...n等等。但是作为一个前端开发者,你知道一个UI组件库是如何被打造出来的吗?读完这篇文章你将学会:如何使用pnpm搭建出一个Monorepo环境如何使用vite搭建一个基本的Vue3脚手架项目如何开发调试一个自己的UI组件库如何使用vite打... 查看详情

如何打造支撑多种视频播放诉求的大前端播放器?(代码片段)

VideoX是内容前端团队基于电商业务(以下简称大淘宝)背景打造的面向大终端场景的前端播放器。这篇文章谈谈我对播放器领域问题的认识,以及当下解决这些问题的思路。大淘宝视频播放的场景有哪些?大淘宝... 查看详情

前端开发调试之代理配置(代码片段)

...在本地调试环境和线上环境之间灵活切换,以将要调试的一个页面为例,页面引用了如下的静态资源,要想在本地开发调试下面引入的js代码,最直接的方法是在把引入的资源路径改成本地调试路径,并起一个本地服务器访问页... 查看详情

bzoj2157旅游(代码片段)

题目描述Ray乐忠于旅游,这次他来到了T城。T城是一个水上城市,一共有N个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T城的任意两个景点之间有且只有一条路径。换句话说,T城中只有N... 查看详情

如何破解intellijidea

《IntelliJIDEA2020.1中文破解版》百度网盘资源免费下载:链接:https://pan.baidu.com/s/1jTnXfDaZEBktKGct12eLYg?pwd=a97z提取码:a97z IntelliJIDEA2020.1是由Jetbrains公司而打造的一款Java集成开发环境,该软件界面简洁美观,操作使用方便,拥有智能... 查看详情

[国家集训队]旅游(代码片段)

Ray乐忠于旅游,这次他来到了T城。T城是一个水上城市,一共有N个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T城的任意两个景点之间有且只有一条路径。换句话说,T城中只有N?1座桥。R... 查看详情

打造你的开发神器——介绍androidstudio上的几个插件(代码片段)

这个月因为各种事情在忙,包括赶项目,回老家,还有准备旅游的事,所以应该写不了四篇博客了。今天介绍一下关于AndroidStudio的几个好用的插件,都是我在用的,它们或能帮你节省时间,或者让你心... 查看详情