webpack 環(huán)境搭建

webpack 環(huán)境搭建

npm 初始化項目

yarn init

安裝webpack依賴

yarn add webpack webpack-dev-server webpack-cli @webpack-cli/init --dev

webpack 初始化

npx webpack-cli init

? Will your application have multiple bundles? Yes
? Type the names you want for your modules (entry files), separated by comma [example: app,vendor] app
? What is the location of "app"? [example: ./src/app] ./src/app
? Which folder will your generated bundles be in? [default: dist]: dist
? Will you be using ES2015? Yes
? Will you use one of the below CSS solutions? SASS
yarn add v1.12.1

添加編譯插件

## 二選一
## 1. class 寫法 向下兼容
yarn add @babel/plugin-proposal-class-properties --dev
## 2. babel 支持 import 
## yarn add @babel/plugin-syntax-dynamic-import --dev
yarn add @babel/preset-env @babel/core cross-env --dev

安裝loader

yarn add html-withimg-loader url-loader file-loader style-loader postcss-loader --dev

插件安裝

yarn add mini-css-extract-plugin uglifyjs-webpack-plugin clean-webpack-plugin copy-webpack-plugin extract-css html-webpack-plugin --dev

安裝webpack-chain

yarn add webpack-chain --dev

此處webpack-chain5.0.1版本剪芍,是針對webpack 4維護的承疲,需特別注意

github地址:webpack-chain

創(chuàng)建webpack.config.js

const path = require('path');
const isProd = process.env.NODE_ENV === 'production';
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

const WebpackChain = require('webpack-chain');

const config = new WebpackChain();

config.when(isProd,config=>{
    config.entry('index').add('./src/index.js');
}).when(!isProd,config=>{
    config.entry('index').add('./src/index.js');
})
// Modify output settings
    .output
    .path(path.join(__dirname, "dist")).filename('[name].js').end()
    .when(isProd, config => {
        config.mode('production');
    }).when(!isProd,config=>{
    config.mode('development').devtool('source-map');
}).end();

/**
 * module
 */
config
    .module
    .rule("compile")
    .test(/\.js$/)
    .include.add(path.join(__dirname,'src')).end()
    .exclude.add(/node_modules/).end()
    .use('babel').loader("babel-loader")
    .options({
        presets: ['@babel/preset-env'],
        plugins: ['@babel/plugin-proposal-class-properties']
    });

config.module
    .rule('images')
    .test(/\.(png|jpg|jpeg|gif)/)
    .use('url-loader')
    .loader('url-loader')
    .options({
        limit: 1 * 1024,
        name: path.posix.join("images","[name].[ext]")
    })

// do not base64-inline SVGs.
// https://github.com/facebookincubator/create-react-app/pull/1180
config.module
    .rule('svg')
    .test(/\.(svg)(\?.*)?$/)
    .use('url-loader')
    .loader('url-loader')
    .options({
        limit: 1024 * 3,//30kb
        fallback: 'file-loader'
    })

config.module
    .rule("fonts")
    .test(/\.(woff2?|eot|ttf|otf)(\?.*)?$/i)
    .use('url-loader')
    .loader('url-loader')
    .options({
        limit: 10000,
        fallback: {
            loader: 'file-loader',
            options: {
                name: path.posix.join("fonts","[name].[ext]")
            }
        }
    });

config.when(isProd,config=>{
    config.module.rule("css").test(/\.(sa|sc|c)ss$/)
        .use("style").loader(MiniCssExtractPlugin.loader);
}).when(!isProd,config=>{
    config.module.rule("css").test(/\.(sa|sc|c)ss$/)
        .use("style-loader").loader("style-loader");
});

config.module.rule("css").test(/\.(sa|sc|c)ss$/)
    .use('css').loader("css-loader").end()
    .use('postcss-loader').loader('postcss-loader');

config.module.rule("scss").test(/\.(sa|sc)ss$/).use("sass-loader").loader("sass-loader");

config.module.rule("lass").test(/\.less$/).use("less-loader").loader("less-loader");

//config.module.rule("html").test(/\.(htm|html)$/i).use("html").loader('html-withimg-loader');

/**
 * plugin
 */
config.when(isProd,config=>{
    const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
    const CleanWebpackPlugin = require('clean-webpack-plugin');
    const CopyWebpackPlugin = require("copy-webpack-plugin");

    config.plugin("clear").use(new CleanWebpackPlugin([path.join(__dirname, 'dist')]));
    config.optimization.splitChunks({
        cacheGroups: {
            commons: {
                chunks: "initial",
                name: "common",
                minChunks: 2,
                maxInitialRequests: 5, // The default limit is too small to showcase the effect
                minSize: 0, // This is example is too small to create commons chunks
                reuseExistingChunk: true // 可設(shè)置是否重用該chunk(查看源碼沒有發(fā)現(xiàn)默認(rèn)值)
            }
        }
    });
    config.plugin("js").use(new UglifyJSPlugin({}));
    config.plugin('extract-css')
        .use(MiniCssExtractPlugin, [{
            filename: "css/[name].css",
            chunkFilename: "css/[name].css"
        }]);
    // config.plugin('copy').use(new CopyWebpackPlugin([
    //     {
    //         from:"./src/sass",
    //     }
    // ]))
})

const HtmlWebpackPlugin = require('html-webpack-plugin');
config.plugin("html").use(HtmlWebpackPlugin, [{
    /*
     template 參數(shù)指定入口 html 文件路徑已烤,插件會把這個文件交給 webpack 去編譯,
     webpack 按照正常流程,找到 loaders 中 test 條件匹配的 loader 來編譯,那么這里 html-loader 就是匹配的 loader
     html-loader 編譯后產(chǎn)生的字符串葵陵,會由 html-webpack-plugin 儲存為 html 文件到輸出目錄,默認(rèn)文件名為 index.html
     可以通過 filename 參數(shù)指定輸出的文件名
     html-webpack-plugin 也可以不指定 template 參數(shù)瞻佛,它會使用默認(rèn)的 html 模板脱篙。
     */
    template: "./public/index.html",
    filename:"index.html",
    /*
     因為和 webpack 4 的兼容性問題,chunksSortMode 參數(shù)需要設(shè)置為 none
     https://github.com/jantimon/html-webpack-plugin/issues/870
     */
    chunksSortMode: 'none',
    xhtml: true,
    minify: {
        collapseWhitespace: false, //刪除空格伤柄,但是不會刪除SCRIPT绊困、style和textarea中的空格
        conservativeCollapse: false, //刪除空格,總是保留一個空格
        removeAttributeQuotes: false, //刪除引號适刀,刪除不需要引號的值
        useShortDoctype: false, //使用短的文檔類型
        removeComments: true,
        collapseBooleanAttributes: true,
        removeScriptTypeAttributes: true
        // more options:
        // https://github.com/kangax/html-minifier#options-quick-reference
    }
}]);


config.when(isProd,config=>{

}).when(!isProd,config=>{
    config.devServer.host('localhost').port(8080).open(process.os === 'darwin');
})

config.resolve.alias.set("@",path.join(__dirname,"src"));

// Export the completed configuration object to be consumed by webpack
module.exports = config.toConfig();

添加啟動腳本

修改package.json文件中scripts節(jié)點考抄,加入如下配置:

  "scripts": {
    "dev": "cross-env NODE_ENV=development webpack-dev-server",
    "build": "cross-env NODE_ENV=production webpack"
  }

創(chuàng)建postcss.config.js

module.exports = {
    plugins: {
        autoprefixer: {
            "browsers": [
                "ie >= 9",
                "ff >= 30",
                "chrome >= 34",
                "safari >= 7",
                "opera >= 23"
            ]
        }
    }
}

創(chuàng)建src/index.js

export default  class demo {
    constructor(){
        console.log("init");
    }
}

創(chuàng)建example/index.js

import Demo from "../src/index";

const demo = new Demo();

根目錄創(chuàng)建index.html

啟動

yarn run dev

原文鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔗彤,隨后出現(xiàn)的幾起案子川梅,更是在濱河造成了極大的恐慌,老刑警劉巖然遏,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贫途,死亡現(xiàn)場離奇詭異,居然都是意外死亡待侵,警方通過查閱死者的電腦和手機丢早,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怨酝,你說我怎么就攤上這事傀缩。” “怎么了农猬?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵赡艰,是天一觀的道長。 經(jīng)常有香客問我斤葱,道長慷垮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任揍堕,我火速辦了婚禮料身,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衩茸。我一直安慰自己芹血,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布楞慈。 她就那樣靜靜地躺著幔烛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抖部。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天议惰,我揣著相機與錄音慎颗,去河邊找鬼。 笑死言询,一個胖子當(dāng)著我的面吹牛俯萎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播运杭,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼夫啊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辆憔?” 一聲冷哼從身側(cè)響起撇眯,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虱咧,沒想到半個月后熊榛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡腕巡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年玄坦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡煎楣,死狀恐怖豺总,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情择懂,我是刑警寧澤喻喳,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站休蟹,受9級特大地震影響沸枯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赂弓,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一绑榴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盈魁,春花似錦翔怎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至珊膜,卻和暖如春容握,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背车柠。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工剔氏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竹祷。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓谈跛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親塑陵。 傳聞我的和親對象是個殘疾皇子感憾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 全局安裝webpack 全局安裝webpack會有個問題,就是當(dāng)你有兩個項目依賴于不同版本的webpack令花,就會有...
    説好的妹紙呢閱讀 1,807評論 0 11
  • 寫在開頭 先說說為什么要寫這篇文章, 最初的原因是組里的小朋友們看了webpack文檔后, 表情都是這樣的: (摘...
    Lefter閱讀 5,279評論 4 31
  • 1. 新建一個文件夾,命名為 webpack-cli , webpack-cli 就是你的項目名,項目名建議使用小...
    魯大師666閱讀 1,467評論 1 3
  • 一直只是聽說過vue.js很火阻桅,但是從來沒有接觸過,這次準(zhǔn)備用它做個項目試試兼都,順便也學(xué)習(xí)一下前端開發(fā)鳍刷,在網(wǎng)上試了很...
    delicacylee閱讀 662評論 0 5
  • 題詩舞劍言罷舉杯,千思萬緒也不如半杯濁酒惹人醉俯抖。折折轉(zhuǎn)轉(zhuǎn)百轉(zhuǎn)低回输瓜,前路莫退,幾多險阻已難歸。歲月蹉跎尤揣,一輩又一輩搔啊,...
    bdjb閱讀 163評論 0 6