webpack+vue打包開發(fā),生產環(huán)境

參考資料webpack指南

最近在學習webpack的一些資料的整理,免得自己日后忘記,現在寫一下開發(fā)的過程先。

首先裝一個node,node官網安裝教程就省略了

打開控制臺輸入生成文件夾并打開,初始化一下項目

mkdir demo1 && cd demo1.

npm init

然后裝一下webpack和webpack-dev-server ,webpack是打包工具,webpack-dev-server是基于webpack一個簡單的 web 服務器,并且能夠實時重新加載。

我是建議你用cnpm國內的鏡像站,裝起來飛快,畢竟墻外的東西有可能慢的要死

npm install --save-dev webpack? webpack-dev-server

不推薦全局安裝 webpack。這會將你項目中的 webpack 鎖定到指定版本,并且在使用不同的 webpack 版本的項目中,可能會導致構建失敗。(來自webpack指南的建議)

接下來裝一下會用到的loader

html:?

????????html-loader(這個是用來解析html的,不過我一般很少用這個)

css:?

????????style-loader(webpack的樣式加載器 通過注入 style 標簽引入樣式)?

????????css-loader (通過 webpack 配置,CLI或內聯使用 loader)

????????less-loader (添加對LESS的支持)

????????less (LESS模塊)

????????postcss-loader (不想寫瀏覽器前綴你就老實加上吧)

????????autoprefixer (自動添加萬惡之源瀏覽器前綴)

? ??????optimize-css-assets-webpack-plugin (壓縮css代碼)

js:

????????babel-core?

????????babel-loader

????????babel-preset-env (使你可以暢快使用ES 6 7 ...N的牛逼哄哄的JavaScript 的編譯器 支持,會幫你自動將新版本的JavaScript編譯成瀏覽器認識的樣子)

????????babel-plugin-transform-vue-jsx?

????????babel-helper-vue-jsx-merge-props (這兩個是vue-jsx的支持,不寫jsx可以不裝)? ??

? ??????uglifyjs-webpack-plugin (壓縮JS代碼的插件)

file:

? ? ? ? file-loader

????????url-loader (一般用來處理資源文件的loader)

vue:

????????vue (vue框架)

? ? ? ? vue-template-compiler

????????vue-loader (Vue 組件轉換為 JavaScript 模塊,各種特性,賊牛逼,感興趣就去看看vue-loader

分類打包

html:

????????html-webpack-plugin

css:

????????extract-text-webpack-plugin

node_env

????????cross-env (提供一個設置環(huán)境變量的scripts,簡單點說就是你可以通過傳遞NODE_ENV告訴代碼你是開發(fā)環(huán)境還是生產環(huán)境)

npm i --save-dev?html-loader style-loader css-loader less-loader less postcss-loader autoprefixer optimize-css-assets-webpack-plugin babel-core babel-loader babel-preset-env babel-plugin-transform-vue-jsx babel-helper-vue-jsx-merge-props uglifyjs-webpack-plugin url-loader vue vue-loader html-webpack-plugin extract-text-webpack-plugin cross-env?clean-webpack-plugin? file-loader? vue-template-compiler 幫忙??

在package.json里面的scripts中加入這個命令,加入之后你就不用老是敲又臭又長的命令行了,直接npm run dev/dist即可

"dist": "cross-env NODE_ENV=dist webpack --config webpack.config.js",

"dev": "cross-env NODE_ENV=dev webpack-dev-server --open"

寫一個webpack.config.js配置文件

首先我們把要用到的一些東西引入進來

const path = require('path');//路徑

const HtmlWebpackPlugin = require('html-webpack-plugin');

//引入html-webpack-plugin 打包index.html

const CleanWebpackPlugin = require('clean-webpack-plugin');

//清理dist文件夾

const extractTextWebpackPlugin = require('extract-text-webpack-plugin');

//打包樣式

const webpack = require('webpack');

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');//壓縮js

const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');//壓縮css

const isDev = process.env.NODE_ENV === 'dev';//環(huán)境參數

先定義一個對象config

config = {

????????entry: {

????????????//entry 是入口起點,我們的資源文件通過此js進行引入

????????????app: './src/js/index.js'

????????},

????????output: {

????????????//輸出文件

????????????filename: '[name].bundle.js',

????????????path: path.resolve(__dirname, 'dist')

????????},

????????plugins:[

????????????????????//配置插件

????????????????????new webpack.DefinePlugin({

????????????????????????'process.env':{

????????????????????????????NODE_ENV: isDev ? '"dev"' : '"dist"'//傳遞環(huán)境變量

????????????????????????}

????????????????}),

????????????????//生成index.html的插件

????????????????new HtmlWebpackPlugin({

????????????????????title:'123'

????????????????})

????????],

????????module:{

????????????//模塊參數

????????????rules:[

? ? ? ? ? ? ? ? //處理ES6.7....n和vue-jsx 這里還需要一個.baelrc的文件來輸入配置

????????????????{

? ? ? ? ? ? ? ? ????????test: /(\.jsx|\.js)$/,

? ? ? ? ? ? ? ? ?????? use: {

? ? ? ? ? ? ? ? ? ? ?????? loader: "babel-loader"

? ? ? ? ? ? ? ? ?????? },

? ? ? ? ? ? ? ? ?????? exclude: /node_modules/

? ? ? ? ? ? ?????},

? ? ? ? ? ? ? ? //處理靜態(tài)資源文件 并輸出到imgaes目錄下

???????? ?????? {

???????????? ?????? test:/\.(gif|jpg|jpeg|png|svg)$/,

???????????? ?????? use:[

???????????????? ?????? 'url-loader?limit=10000&name=images/[name].[ext]'

? ? ? ? ? ? ? ?????? ]

??????? ?????? ?}

????????????]

????}

};

由于開發(fā)和生產環(huán)境的不同配置也需要不一樣,根據isDev來判斷,先來配置一下開發(fā)環(huán)境的代碼,這里要用 webpack-dev-server 來搭建一個簡單的web服務器。

處理css的時候一般在生產環(huán)境才把他們打包到一個css文件中,在開發(fā)環(huán)境直接讓它插在代碼中編譯起來更加快一點

// webpack-dev-server配置

config.devServer = {

????contentBase: "./dist",//本地服務器所加載的頁面所在的目錄 ????historyApiFallback: true,//不跳轉 inline: true//實時刷新

};

config.devtool='inline-source-map';

//由于開發(fā)環(huán)境的代碼都會被打包到一個js中,我們添加一個source-map.方便你開發(fā) 的時候快速定位到代碼

config.plugins.push(

????new webpack.HotModuleReplacementPlugin(),

????//模塊熱替換

????new webpack.NoEmitOnErrorsPlugin()

????// 在編譯出現錯誤時,使用?NoEmitOnErrorsPlugin?來跳過輸出階段。這樣可以確保輸出資源不會包含錯誤

);

config.module.rules.push(

{

????????test:/\.less$/,

????????use:[

????????????'style-loader',

????????????'css-loader',

????????????'less-loader',

????????????{

????????????????loader:'postcss-loader',?????//代碼自動補全,瀏覽器前綴添加

????????????????options: {

????????????????????????plugins:(loader) =>[ require('autoprefixer')({browsers :[' last 5 versions']}) ]

????????????????}

????????????}

????]

},

//處理.vue文件的loader

{

????test:/\.vue$/,

????use:[

????????{ ????

????????????loader:'vue-loader'

????????}

????]

}

)

配好開發(fā)環(huán)境后,還要配一下生產環(huán)境的代碼

config.entry = {

? ??app: path.join(__dirname,'./src/js/index.js'),

? ??vendor:['vue']????//聲明要抽離的類庫

}

config.module.rules.push(

{

? ??test:/\.less$/,

? ??use:extractTextWebpackPlugin.extract({

????????????//通過調用這個方法來把css從js代碼中提取出來

? ? ? ? ? ??fallback:'style-loader',

? ??????????use:[

? ??????????????'css-loader',

? ??????????????'less-loader',

? ??????????????{

? ??????????????????loader:'postcss-loader',

? ? ? ? ? ? ? ? ? ??options:{

? ??????????????????????plugins:(loader) =>[require('autoprefixer')({browsers :[' last 5 versions']})]

? ?????????????????????}

? ??????????????}

? ??????????]

? ??})

},

{

????test:/\.vue$/,

????use:[

????????{

????????????loader:'vue-loader',

????????????options: {

????????????????????extractCSS: true

????????????????}

? ? ? ? ?}

????]

}

);

config.plugins.push(

? ??new CleanWebpackPlugin(['dist']),????//清理打包文件夾

? ??new extractTextWebpackPlugin('styles.[contentHash:8].css'),????//輸出 styles.css文件

? ??new webpack.optimize.ModuleConcatenationPlugin(),

? ??new webpack.optimize.CommonsChunkPlugin({

????????//分離出類庫

? ?????name:'vendor'

? ??}),

? ? new OptimizeCssAssetsPlugin({ ????

????????//css壓縮

? ??????assetNameRegExp: /.css$/g,

? ??????cssProcessor: require('cssnano'),

? ? ? ? cssProcessorOptions: {

? ? ? ? ? ? discardComments: {

? ? ? ? ? ? ? ? removeAll: true

? ? ? ? ? ? }

? ? ? ? },

? ? ? ? canPrint: true

? ? }),

? ??new webpack.optimize.CommonsChunkPlugin({

? ?????name:'runtime'

? ??}),

? ??new webpack.BannerPlugin('版權所有,翻版必究'),

? ??new UglifyJsPlugin({

????????//壓縮js代碼

? ??????test: /\.js($|\?)/i

? ??})

);

config.output.filename = 'js/[name].[chunkhash:8].js';????//定義輸出的js

這樣子配置算是寫完了最后再加一句

module.exports = config;

還有要配置一下 .babelrc文件,此文件跟webpack.config.js同級即可

{

? "presets": ["env"],

? "plugins": ["transform-vue-jsx"]

}

dist是打包之后的文件夾

src是你開發(fā)寫代碼的文件夾

文件目錄應該是這樣子的

寫到這里也就差不多了,下次再往里面配置一下express吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 版權聲明:本文為博主原創(chuàng)文章,未經博主允許不得轉載。 webpack介紹和使用 一、webpack介紹 1、由來 ...
    it筱竹閱讀 11,444評論 0 21
  • GitChat技術雜談 前言 本文較長,為了節(jié)省你的閱讀時間,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,869評論 7 110
  • 寫在開頭 先說說為什么要寫這篇文章, 最初的原因是組里的小朋友們看了webpack文檔后, 表情都是這樣的: (摘...
    Lefter閱讀 5,432評論 4 31
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,359評論 7 35
  • 記得2004年的時候,互聯網開發(fā)就是做網頁,那時也沒有前端和后端的區(qū)分,有時一個網站就是一些純靜態(tài)的html,通過...
    陽陽陽一堆陽閱讀 3,454評論 0 5

友情鏈接更多精彩內容