成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[169799]]

前情提要

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

主菜--沒有開胃湯

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

一、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都行,當然還可以用一種通用方法,后面補上。

二、開發環境配置--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,這個時候入口的配置就比較麻煩,我這里是放單獨一個文件里面配置,我們公司是靠規定來執行,也就是一個文件夾所有的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。

三、打包環境配置--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 

基本跟開發的差不多,差別在于:

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 參數 

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

責任編輯:龐桂玉 來源: 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內置函數開發

2012-03-28 09:40:40

JavaScript

2021-02-04 10:22:32

前端開發技術

2018-07-20 14:30:15

2023-02-13 00:18:22

前端庫框架集合

2020-11-10 07:11:23

Linux內核補丁

2017-11-07 22:25:17

網站評測工具YSlow

2019-09-03 11:32:36

PythonLinux操作系統

2020-02-25 22:00:22

機器人人工智能系統

2024-04-01 11:52:46

2014-08-14 10:31:04

2020-06-18 10:03:13

在家工作疫情統一通信

2013-07-05 14:45:05

AndroidOpenGL ES開發

2018-01-10 12:09:12

Android開發程序員

2017-06-22 10:44:55

Linux調試器準備環境

2021-01-26 10:33:45

前端開發技術

2020-05-19 10:45:31

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

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区四区五区中文 | 你懂的在线视频播放 | 日韩国产中文字幕 | 精品一区二区三区在线观看国产 | 欧美aa在线 | 亚洲va欧美va人人爽午夜 | 在线小视频 | 欧美成人免费电影 | 久久国内精品 | 自拍偷拍第一页 | 96av麻豆蜜桃一区二区 | 国产玖玖| 欧美一级免费 | 免费中文字幕 | 亚洲激情在线 | 九九九久久国产免费 | 亚洲午夜小视频 | 色综合天天网 | 精久久久| 中文字幕一区在线 | 亚洲视频一区二区三区 | 99久久精品国产毛片 | 日韩三级免费网站 | 日本久久久久久 | 国产在线a| 日韩a视频 | 国产精品一区二区三 | 亚洲精品国产电影 | 亚洲欧美日韩精品久久亚洲区 | 91精品国产综合久久久久久丝袜 | 一级做a爰片性色毛片16 | 欧美亚洲国产一区二区三区 | 天天久 | 国产精品久久久久无码av | 久久精品日 | 亚洲精品一区二区 | 欧美成人a | 精品一区国产 | 日本三级电影在线免费观看 | 国产91综合一区在线观看 | 色婷婷久久久亚洲一区二区三区 |