偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何打造一個令人愉悅的前端開發(fā)環(huán)境(二)

開發(fā) 開發(fā)工具
這篇文章主要講目前火熱的打包構建方式--Webpack的使用方式。其實Webpack的入門指導文章非常多,配置方式也各有各樣,如果不知道Webpack是什么或者不是很清楚各項配置含義的開發(fā)者,可以先看葉大神的入門級指南--Webpack 入門指迷。

[[169799]]

前情提要

上一篇文章介紹了目前前端比較流行的各種編輯器,以及各種流行的打包方式,***給了一個Gulp的例子,這個例子還是14年的時候寫的,還有一些可以優(yōu)化的空間,就不討論了,這篇文章主要講目前火熱的打包構建方式--Webpack的使用方式。

主菜--沒有開胃湯

其實Webpack的入門指導文章非常多,配置方式也各有各樣,這里我推薦題葉大神的入門級指南--Webpack 入門指迷,如果不知道Webpack是什么或者不是很清楚各項配置含義的開發(fā)者,可以看此文章掃掃盲。畢竟我這篇文章并不是特別基礎。

一、base.js

  1. var path = require('path'
  2. var baseConfig = { 
  3.     resolve: { 
  4.         extensions: ['''.js'], 
  5.         fallback: [path.join(__dirname, '../node_modules')], 
  6.         alias: { 
  7.             'src': path.resolve(__dirname, '../src'), 
  8.             'assets': path.resolve(__dirname, '../src/assets'), 
  9.             'components': path.resolve(__dirname, '../src/components'
  10.         } 
  11.     }, 
  12.     module: { 
  13.         loaders: [{ 
  14.             test: /\.js$/, 
  15.             loader: 'babel'
  16.             exclude: /node_modules/ 
  17.         }, { 
  18.             test: /\.(png|jpe?g|gif|svg|woff2?|eot|ttf|otf)(\?.*)?$/, 
  19.             loader: 'url?limit=8192&context=client&name=[path][name].[hash:7].[ext]' 
  20.         }, 
  21.         { 
  22.             test: /\.css$/, 
  23.             loader: 'style!css!autoprefixer'
  24.         }, 
  25.         { 
  26.             test: /\.scss$/, 
  27.             loader: 'style!css!autoprefixer!sass' 
  28.         }] 
  29.     } 
  30. }; 
  31.  
  32. 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都行,當然還可以用一種通用方法,后面補上。

二、開發(fā)環(huán)境配置--config

  1. var webpack = require('webpack'); 
  2. var path = require('path'
  3. var merge = require('webpack-merge'
  4. var baseConfig = require('./webpack.base'
  5. var getEntries = require('./getEntries'
  6.  
  7. var hotMiddlewareScript = 'webpack-hot-middleware/client?reload=true'
  8.  
  9. var assetsInsert = require('./assetsInsert'
  10.  
  11. module.exports = merge(baseConfig, { 
  12.   entry: getEntries(hotMiddlewareScript), 
  13.   devtool: '#eval-source-map'
  14.   output: { 
  15.     filename: './[name].[hash].js'
  16.     path: path.resolve('./dist'), 
  17.     publicPath:'./dist' 
  18.   }, 
  19.   plugins: [ 
  20.     new webpack.DefinePlugin({ 
  21.       'process.env': { 
  22.         NODE_ENV: '"development"' 
  23.       } 
  24.     }), 
  25.     new webpack.optimize.OccurenceOrderPlugin(), 
  26.     new webpack.HotModuleReplacementPlugin(), 
  27.     new webpack.NoErrorsPlugin(), 
  28.     new assetsInsert() 
  29.   ] 
  30. }) 

說說這個配置中的一些難點:

1、getEntries 是用來配置入口文件,一般很多人是自己手寫,或者SPA頁面,只有一個入口, 很容易就寫出來,但是公司中,很多情況,是需要多入口,也就是多路由的Url,這個時候入口的配置就比較麻煩,我這里是放單獨一個文件里面配置,我們公司是靠規(guī)定來執(zhí)行,也就是一個文件夾所有的main.js都認為是入口文件,其他都忽略。

  1. function getEntry(hotMiddlewareScript) { 
  2.     var pattern = paths.dev.js + 'project/**/main.js'
  3.     var array = glob.sync(pattern); 
  4.     var newObj = {}; 
  5.  
  6.     array.map(function(el){ 
  7.         var reg = new RegExp('project/(.*)/main.js','g'); 
  8.         reg.test(el); 
  9.         if (hotMiddlewareScript) { 
  10.             newObj[RegExp.$1] = [el, hotMiddlewareScript]; 
  11.         } else { 
  12.             newObj[RegExp.$1] = el; 
  13.         } 
  14.     }); 
  15.     return newObj; 

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

三、打包環(huán)境配置--production

  1. var webpack = require('webpack'); 
  2. var path = require('path'
  3. var merge = require('webpack-merge'
  4. var baseConfig = require('./webpack.base'
  5. var getEntries = require('./getEntries'
  6. var ExtractTextPlugin = require('extract-text-webpack-plugin'); 
  7. var assetsInsert = require('./assetsInsert'
  8.  
  9. var productionConf = merge(baseConfig, { 
  10.     entry: getEntries(), 
  11.     output: { 
  12.         filename: './[name].[hash].js'
  13.         path: path.resolve('./public/dist'), 
  14.         publicPath: './' 
  15.     }, 
  16.     plugins: [ 
  17.         new webpack.DefinePlugin({ 
  18.             'process.env': { 
  19.                 NODE_ENV: '"production"' 
  20.             } 
  21.         }), 
  22.         new ExtractTextPlugin('./[name].[hash].css', { 
  23.             allChunks: true 
  24.         }), 
  25.         new webpack.optimize.UglifyJsPlugin({ 
  26.             compress: { 
  27.                 warnings: false 
  28.             } 
  29.         }), 
  30.         new webpack.optimize.OccurenceOrderPlugin(), 
  31.         new assetsInsert() 
  32.     ] 
  33. }) 
  34.  
  35. productionConf.module.loaders = [ 
  36.              { 
  37.                 test: /\.js$/, 
  38.                 loader: 'babel'
  39.                 exclude: /node_modules/ 
  40.             }, { 
  41.                 test: /\.(png|jpe?g|gif|svg|woff2?|eot|ttf|otf)(\?.*)?$/, 
  42.                 loader: 'url?limit=8192&context=client&name=[path][name].[hash:7].[ext]' 
  43.             }, 
  44.             { 
  45.                 test: /\.css$/, 
  46.                 loader: ExtractTextPlugin.extract('style''css'), 
  47.             }, 
  48.             { 
  49.                 test: /\.scss$/, 
  50.                 loader: ExtractTextPlugin.extract('style''css!sass'
  51.             }] 
  52.  
  53. module.exports = productionConf 

基本跟開發(fā)的差不多,差別在于:

1、使用ExtractTextPlugin 來打包css,所以要干掉原來base的loaders,重新寫了一個,在最下面。

2、UglifyJsPlugin 給js壓縮代碼。其他沒有什么好解釋的了,一樣的。

四、構建命令

  1. require('shelljs/global'
  2. env.NODE_ENV = 'production' 
  3. var ora = require('ora'
  4. var webpack = require('webpack'
  5. var webpackConfig = require('./webpack.production.config'
  6.  
  7. var spinner = ora('building for production...'
  8. spinner.start() 
  9.  
  10. var staticPath = __dirname + '/../public/dist/' 
  11. rm('-rf', staticPath) 
  12. mkdir('-p', staticPath) 
  13.  
  14. webpack(webpackConfig, function (err, stats) { 
  15.   spinner.stop() 
  16.   if (err) throw err 
  17.   process.stdout.write(stats.toString({ 
  18.     colors: true
  19.     modules: false
  20.     children: false
  21.     chunks: false
  22.     chunkModules: false 
  23.   }) + '\n'
  24. }) 

寫一個build.js,然后在package.json里面添加 script 參數(shù) 

  1. "build""node build.js"//這里記得寫自己build.js路徑 

甜點(馬卡龍)--有點膩

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

  1.   test: /\.vue$/, 
  2.   loader: 'vue' 

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

還有可以隨意更改Css預編譯器的類型,用你自己喜歡就行,或者跟我們前面提到的方法,把所有類型都配置上,

  1. var path = require('path'
  2. var config = require('../config'
  3. var ExtractTextPlugin = require('extract-text-webpack-plugin'
  4.  
  5. exports.assetsPath = function (_path) { 
  6.   return path.posix.join(config.build.assetsSubDirectory, _path) 
  7.  
  8. exports.cssLoaders = function (options) { 
  9.   options = options || {} 
  10.   // generate loader string to be used with extract text plugin 
  11.   function generateLoaders (loaders) { 
  12.     var sourceLoader = loaders.map(function (loader) { 
  13.       var extraParamChar 
  14.       if (/\?/.test(loader)) { 
  15.         loader = loader.replace(/\?/, '-loader?'
  16.         extraParamChar = '&' 
  17.       } else { 
  18.         loader = loader + '-loader' 
  19.         extraParamChar = '?' 
  20.       } 
  21.       return loader + (options.sourceMap ? extraParamChar + 'sourceMap' : ''
  22.     }).join('!'
  23.  
  24.     if (options.extract) { 
  25.       return ExtractTextPlugin.extract('vue-style-loader', sourceLoader) 
  26.     } else { 
  27.       return ['vue-style-loader', sourceLoader].join('!'
  28.     } 
  29.   } 
  30.  
  31.   // http://vuejs.github.io/vue-loader/configurations/extract-css.html 
  32.   return { 
  33.     css: generateLoaders(['css']), 
  34.     postcss: generateLoaders(['css']), 
  35.     less: generateLoaders(['css''less']), 
  36.     sass: generateLoaders(['css''sass?indentedSyntax']), 
  37.     scss: generateLoaders(['css''sass']), 
  38.     stylus: generateLoaders(['css''stylus']), 
  39.     styl: generateLoaders(['css''stylus']) 
  40.   } 
  41.  
  42. // Generate loaders for standalone style files (outside of .vue) 
  43. exports.styleLoaders = function (options) { 
  44.   var output = [] 
  45.   var loaders = exports.cssLoaders(options) 
  46.   for (var extension in loaders) { 
  47.     var loader = loaders[extension] 
  48.     output.push({ 
  49.       test: new RegExp('\\.' + extension + '$'), 
  50.       loader: loader 
  51.     }) 
  52.   } 
  53.   return output 

這就是把所有的css預編譯的都加到配置里面了。

總結下--買單啦

Webpack多種多樣,就算一個loaders都有好幾種不同的配置,讓人很是頭疼,最關鍵的是很多插件自己的文檔也不清不楚,弄得大家都很迷茫,我的經(jīng)驗就是多試多測,自己多寫一寫,看命令行打印的錯誤,去找原因,不要一看到報錯就慌了,很多新手最容易犯錯就是一看到報錯就懷疑人生了,一定要看報錯記錄,一般都有提示,按照提示去解決相應問題就好啦。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2016-08-04 14:08:57

前端javascripthtml

2016-11-07 21:15:12

前后端分離expressJavascript

2016-11-07 21:24:08

HtmlNode.jsJavascript

2023-12-27 14:19:33

Python內(nèi)置函數(shù)開發(fā)

2012-03-28 09:40:40

JavaScript

2021-02-04 10:22:32

前端開發(fā)技術

2018-07-20 14:30:15

2023-02-13 00:18:22

前端庫框架集合

2020-11-10 07:11:23

Linux內(nèi)核補丁

2017-11-07 22:25:17

網(wǎng)站評測工具YSlow

2019-09-03 11:32:36

PythonLinux操作系統(tǒng)

2024-04-01 11:52:46

2020-02-25 22:00:22

機器人人工智能系統(tǒng)

2020-06-18 10:03:13

在家工作疫情統(tǒng)一通信

2013-07-05 14:45:05

AndroidOpenGL ES開發(fā)

2015-03-10 11:21:44

JavaScript組JavaScript

2014-08-14 10:31:04

2021-01-26 10:33:45

前端開發(fā)技術

2013-09-17 12:26:43

BYOD環(huán)境安全BYOD移動設備

2020-05-19 10:45:31

沙箱前端原生對象
點贊
收藏

51CTO技術棧公眾號