摘要:這里我們可以嘗試運行一下命令嘗試能否構(gòu)建成功,成功的情況下在目錄下會生成的文件。在添加調(diào)試代碼打開調(diào)試面板在下拉選項中選擇添加配置或者直接創(chuàng)建并打開文件使用了解相關(guān)屬性。
webpack 作為目前主流的構(gòu)建工具,其較快的版本迭代和復(fù)雜的配置方式,使得每次開發(fā)前不得不規(guī)劃相當(dāng)部分時間來調(diào)試。這里將記錄整個環(huán)境的搭建過程,為新手提供基礎(chǔ)思路。
就像我在開發(fā)vue-sitemap時一樣,構(gòu)建工具往往需要達(dá)到下面幾個需求:
構(gòu)建生成 CommonJS/UMD/ES Modules 三種模式的代碼提供給使用者
需運行測試和檢查測試覆蓋的進度
開發(fā)時候使用 VS Code 編輯器進行斷點調(diào)試
以上三個作為開發(fā)一個組件(package)是基礎(chǔ)中基礎(chǔ)的需求,當(dāng)然還有更多細(xì)節(jié)內(nèi)容需要添加,由于篇幅過長另加文章再說吧。(歡迎各位讀者評論留下你認(rèn)為需要的功能( ? ?ω?? )?)
第一步:構(gòu)建工具接下來我們先從最基礎(chǔ)的開始,需要安裝 Node.js(10.x) 作為所有代碼的運行環(huán)境, webpack 也是一樣。
初始化項目由于我需要把項目發(fā)布至 npm 的,使用命令初始化項目描述文件 package.json
npm init
初次化細(xì)節(jié)各位讀者找其他文章補全吧,這里不細(xì)說
接下來看看目錄結(jié)構(gòu)
│ package.json //項目描述文件 │ README.md //GitHub創(chuàng)建倉庫時默認(rèn)創(chuàng)建 ├─src //源代碼目錄 │ index.js //入口文件 ├─tests //測試代碼目錄 │ ├─dist //生產(chǎn)文件的目錄 │ └─docs //文檔目錄添加 webpack
npm install -D webpack webpack-cli cross-env //or //yarn add webpack webpack-cli cross-env -D
這里使用的 webpack v4,后續(xù)設(shè)置也是基于4來設(shè)置,cross-env是幫助在 win 下能正常使用環(huán)境變量的包,我開發(fā)在 win 環(huán)境于是在這加上。yarn 是一款快速、可靠、安全的依賴管理工具。如果你覺得 npm 安裝時候較慢的話,不妨試試。
等依賴下載解決完畢之后,,在package.json設(shè)置構(gòu)建命令方便之后使用。
//# package.json { //... "scripts": { "build": "cross-env NODE_ENV=production webpack --propress --hide-modules", } }
這里我們可以嘗試運行一下命令npm run build嘗試能否構(gòu)建成功,成功的情況下在dist目錄下會生成main.js的文件。
配置 webpack創(chuàng)建 webpack.config.js文件來配置 webpack 。為滿足我們的第一個需要生成三種模式的代碼:
//# webpack.config.js const package = require("./package.json") const path = require("path") const config = { entry: "./src/index.js", //入口文件 output: { //輸出設(shè)置 path: path.resolve(__dirname, "./dist"), filename: `${package.name}.js` }, resolve: { alias: { "@": path.resolve(__dirname, "./src") } } } if (process.env.NODE_ENV === "umd") { config.optimization = { minimize: false }; config.output.library = package.name; config.output.libraryTarget = "umd2"; config.output.filename = `${package.name}.js`; } if (process.env.NODE_ENV === "umd:min") { config.output.library = package.name; config.output.libraryTarget = "umd2"; config.output.filename = `${package.name}.min.js`; } if (process.env.NODE_ENV === "es") { config.output.library = package.name; config.output.libraryTarget = "amd"; config.output.filename = `${package.name}.es.js`; } if (process.env.NODE_ENV === "commonjs") { config.output.library = package.name; config.output.libraryTarget = "commonjs2"; config.output.filename = `${package.name}.common.js`; } module.exports = config添加構(gòu)建命令
為 package.json 添加新的運行命令
//# package.json { "version": "0.1.0", "name": "vscode-mocha-webpack-example", "description": "用于管理導(dǎo)航、面包屑及路由等基于vue的功能整合", "main": "./src/index.js", "scripts": { "build": "npm run build:commonjs && npm run build:es && npm run build:umd && npm run build:umd:min", "build:umd": "cross-env NODE_ENV=umd webpack --mode=production --progress --hide-modules", "build:umd:min": "cross-env NODE_ENV=umd:min webpack --mode=production --progress --hide-modules", "build:es": "cross-env NODE_ENV=es webpack --mode=production --progress --hide-modules", "build:commonjs": "cross-env NODE_ENV=commonjs webpack --mode=production --progress --hide-modules" } ... }
運行npm run build就會 CommonJS/UMD/ES Modules 三種模式生成對應(yīng)的文件。
大概是這樣子:
├─dist │ vscode-mocha-webpack-example.common.js │ vscode-mocha-webpack-example.es.js │ vscode-mocha-webpack-example.min.js │ vscode-mocha-webpack-example.js指定終端
為了使你的構(gòu)建文件成為最終發(fā)布包的一部分,你必須聲明它們。將以下內(nèi)容添加到package.json:
"main": "dist/vscode-mocha-webpack-example.common.js", "module": "dist/vscode-mocha-webpack-example.es.js", "jsnext:main": "dist/vscode-mocha-webpack-example.es.js", "files": [ "dist", "src" ],
files部分告訴npm在發(fā)布時打包這些文件夾(否則,它們將被忽略,因為它們列在.gitignore文件中)
main定義CommonJS構(gòu)建的終端
jsnext:main和module定義了ES2015構(gòu)建的終端(我們定義了兩個終端,因為jsnext:main是最早使用的規(guī)范,而module則更符合標(biāo)準(zhǔn)規(guī)范)。
第二步,設(shè)置babel通過 babel 使得我們使用最新的語法,而不必?fù)?dān)心運行環(huán)境不支持的問題。在webpack的下我們需要用到babel-loader來導(dǎo)入babel支持,關(guān)于最新的兼容設(shè)置還需使用上babel-preset-env:
npm install -D babel babel-cli babel-preset-env //or //yarn add babel babel-cli babel-preset-env -D創(chuàng)建 babel 配置文件
接著在.babelrc文件里設(shè)置babel兼容的規(guī)則:
{ "presets": [ [ "env", { "useBuiltIns": false, "modules": false } ] ] }為 webpack 添加 babel-loader
當(dāng)我們使用最新語法編寫 JavaScript 時,webpack 會匹配將所有 JS 文件給 babel 的處理。
const package = require("./package.json") const path = require("path") const config = { entry: "./src/index.js", output: { path: path.resolve(__dirname, "./dist"), filename: `${package.name}.js` }, resolve: { alias: { "@": path.resolve(__dirname, "./src") } }, module: { rules: [ { test: /.js$/, loader: "babel-loader", exclude: /node_modules/ } ] } } ... module.exports = config
當(dāng)運行構(gòu)建時webpack便會加載babel及其相關(guān)的設(shè)置將代碼轉(zhuǎn)換并生成,到這步構(gòu)建相關(guān)的設(shè)置基本完成。
第三步,添加自動化測試相信對自動化測試有所了解的讀者應(yīng)該對mocha并不陌生,不了解的可以先去補補相關(guān)知識再往下看。簡單的測試較多使用mocha來進行處理,還有斷言庫chai和提供promise支持的chai-as-promised等等,下面先把這些依賴安裝上:
npm install -D mocha mocha-webpack chai chai-as-promised //or //yarn add mocha mocha-webpack chai chai-as-promised -D
測試代碼想使用es新特性時可以使用mocha-webpack這個插件。
然后在package.json添加上測試命令:
{ //... "scripts": { "build": "npm run build:commonjs && npm run build:es && npm run build:umd && npm run build:umd:min", "build:umd": "cross-env NODE_ENV=umd webpack --mode=production --progress --hide-modules", "build:umd:min": "cross-env NODE_ENV=umd:min webpack --mode=production --progress --hide-modules", "build:es": "cross-env NODE_ENV=es webpack --mode=production --progress --hide-modules", "test": "cross-env NODE_ENV=test mocha-webpack tests/**/*.spec.js" } //... }
.babelrc 也需要設(shè)置一下:
{ //... "env": { "test": { "presets": [ [ "env", { "modules": false, "targets": { "node": "current" } } ] ] } } }
為了能測試添加tests/unit/example.spec.js和src/index.js兩個文件,代碼如下:
├─src │ index.js └─tests └─unit example.spec.js
//# src/index.js export function getRole(user){ switch(user){ case "Packy": return "admin" case "Joan": return "reader" } } //# tests/unit/example.spec.js import { assert } from "chai"; import { getRole } from "@/index"; describe("Testing", ()=>{ it("Packy is admin", () => { assert.equal(getRole("Packy"), "admin") }) it("Joan is reader", () => { assert.equal(getRole("Joan"), "reader") }); })
現(xiàn)在運行測試命令就能得出測試結(jié)果了:
npm run test
大概輸出是這個樣子:
WEBPACK Compiling... [======================= ] 91% (additional chunk assets processing) WEBPACK Compiled successfully in 5893ms MOCHA Testing... Testing √ Packy is admin √ Joan is reader 2 passing (39ms) MOCHA Tests completed successfully關(guān)于測試覆蓋率的問題
有了測試還得知道測試是否都覆蓋了所有代碼(聽說基本要到80%,有些團隊可能要求更高90~95%),那如何得知?
nyc這個包就能幫助到我去檢驗測試覆蓋率,首先先安裝依賴:
npm install -D nyc babel-plugin-istanbul
再設(shè)置檢查范圍和添加命令:
//# package.json { ... "scripts": { "build": "npm run build:commonjs && npm run build:es && npm run build:umd && npm run build:umd:min", "build:umd": "cross-env NODE_ENV=umd webpack --mode=production --progress --hide-modules", "build:umd:min": "cross-env NODE_ENV=umd:min webpack --mode=production --progress --hide-modules", "build:es": "cross-env NODE_ENV=es webpack --mode=production --progress --hide-modules", "build:commonjs": "cross-env NODE_ENV=commonjs webpack --mode=production --progress --hide-modules", "test": "cross-env NODE_ENV=test nyc mocha-webpack tests/**/*.spec.js" }, ... "nyc": { "include": [ "src/**" ], "instrument": false, "sourceMap": false } ... }
安裝依賴中也看到babel也需要添加相關(guān)的設(shè)置:
//# .babelrc { ... "env": { "test": { "presets": [ [ "env", { "modules": false, "targets": { "node": "current" } } ] ], "plugins": [ "istanbul" ] } } }
運行npm run test將會得到以下內(nèi)容:
WEBPACK Compiling... [======================= ] 91% (additional chunk assets processing) WEBPACK Compiled successfully in 5893ms MOCHA Testing... Testing √ Packy is admin √ Joan is reader 2 passing (39ms) MOCHA Tests completed successfully ----------|----------|----------|----------|----------|-------------------| File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s | ----------|----------|----------|----------|----------|-------------------| All files | 100 | 100 | 100 | 100 | | index.js | 100 | 100 | 100 | 100 | | ----------|----------|----------|----------|----------|-------------------|
簡單說一下這四欄東西代表什么意思:
Stmts : Statement coverage 聲明覆蓋率,程序中的每個語句都已執(zhí)行嗎?
Branch: Branch coverage 分支覆蓋率,是否已執(zhí)行每個控制結(jié)構(gòu)的每個分支(也稱為DD路徑)(例如if和case語句)?例如,給定if語句,是否已執(zhí)行true和false分支?
Funcs: Function coverage 方法覆蓋率,是否已調(diào)用程序中的每個函數(shù)(或子例程)?
Lines: Line coverage 行代碼覆蓋,是否已執(zhí)行源文件中的每個可執(zhí)行的行?
不在覆蓋范圍內(nèi)的代碼的行數(shù)會在Uncovered Line這欄顯示。
為測試提供async/await支持在測試中想使用async/await語法,需新增setup.js文件并在入口處添加babel-polyfill:
require("babel-polyfill");
并在.babelrc修改useBuiltIns為entry:
{ ... "env": { "test": { "presets": [ [ "env", { "useBuiltIns": "entry", "modules": false, "targets": { "node": "current" } } ] ], "plugins": [ "istanbul" ] } } }
接下來在src/index.js和tests/example.spec.js兩個文件添加新的代碼:
//# src/index.js export function getUsers(){ return new Promise((resolve, reject)=>{ setTimeout(()=>{ console.log("123") resolve(["Packy", "Joan"]) }, 1000) }) } //# tests/unit/example.spec.js describe("GetUsers", ()=>{ it("get result is Array", async ()=>{ const users = await getUsers(); assert.isArray(users, "[message]"); }) })
運行測試就能看到效果!
讓測試更進一步,在 VS Code 中調(diào)試想在VS Code斷點調(diào)試代碼需要額外增加一些設(shè)置,添加以下代碼至 webpack.config.js。
//# webpack.config.js //... if (process.env.NODE_ENV === "test") { config.devtool = "eval-source-map"; config.output = Object.assign(config.output, { devtoolModuleFilenameTemplate: "[absolute-resource-path]", devtoolFallbackModuleFilenameTemplate: "[absolute-resource-path]?[hash]" }); } module.exports = config;在VS Code 添加調(diào)試代碼
打開 VS Code 調(diào)試面板在下拉選項中選擇添加配置(或者直接創(chuàng)建并打開.vscode/launch.json文件):
// 使用 IntelliSense 了解相關(guān)屬性。 // 懸停以查看現(xiàn)有屬性的描述。 // 欲了解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387 { "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Mocha-webpack Tests", "program": "${workspaceFolder}/node_modules/mocha-webpack/bin/mocha-webpack", "args": [ "--full-trace", "--timeout", "999999", "--colors", "tests/**/*.js" ], "sourceMaps": true, "env": { "NODE_ENV": "test" }, "internalConsoleOptions": "openOnSessionStart" }] }
在src目錄下的源代碼或是tests目錄下的測試代碼都能獲得斷點效果,想馬上嘗試可以下載本文例子vscode-mocha-webpack-example,安裝依賴后就能嘗試斷點調(diào)試了。
設(shè)置參考源自vscode-ts-webpack-node-debug-example
值得一提的是,上面參考例子原文說devtool使用eval相關(guān)的設(shè)置并不能斷點,但是在使用mocha-webpack調(diào)試時上面例子并不能實現(xiàn)斷點。在我和公司小伙伴多番尋找vscode和mocha-webpack的issue后,經(jīng)過各種嘗試下發(fā)現(xiàn)設(shè)置成eval-source-map便能實現(xiàn)最佳斷點效果(eval也能實現(xiàn)但是由于斷點sourcemap指向的源是生成后的文件導(dǎo)致在斷點時多少會產(chǎn)生偏移)。
吐槽:在使用nvm切換nodejs環(huán)境時發(fā)現(xiàn)npm下載不了,打開github的下載鏈接直接404了,驚悚地發(fā)現(xiàn)npm整個搬走?(`Д′*)9?┴┴,為解決這個問題請下載最新版本v1.1.7的nvm。
最后:
我的動力來自你的指頭,請用你的指頭使勁給我個贊吧!d(′ω` )
覺得本文有幫助的話不要忘記點一下收藏φ(>ω<*) 哦!
同時歡迎各路新手、大神在本文下方吐槽留言,謝謝參與討論的各位仁兄!( ? ?ω?? )?
下面是本文完整例子,記得star一下!
vscode-mocha-webpack-example
同時非常感謝Mather協(xié)同編輯!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/99427.html
摘要:類的數(shù)據(jù)類型就是函數(shù),類本身就指向構(gòu)造函數(shù)。另一個需要注意的地方是,在子類的構(gòu)造函數(shù)中,只有調(diào)用之后,才可以使用關(guān)鍵字,否則會報錯。 1.ES6-- 新一代JavaScript標(biāo)準(zhǔn) 1.1 const和let關(guān)鍵字 以前只有全局變量以及函數(shù)內(nèi)部的局部變量,所以以前的局部變量只能定義在函數(shù)里面,但是現(xiàn)在不是了,可以通過let關(guān)鍵字來定義局部變量。同時通過const關(guān)鍵字來定義常量,定義后...
摘要:鑒于目前通行的做法就是在所有瀏覽器中一致同仁地加載,相比而言條件可以讓大部分現(xiàn)代瀏覽器用戶避免加載代碼。 原文地址: Modern Script Loading, 文章作者是Preact作者Jason Miller showImg(https://segmentfault.com/img/remote/1460000019817095?w=1500&h=715); 背景知識 先簡單...
摘要:先說下我面試情況,我一共面試了家公司。篇在我面試的眾多公司里,只有同城的面問到相關(guān)問題,其他公司壓根沒問。我自己回答的是自己開發(fā)組件面臨的問題。完全不用擔(dān)心對方到時候打電話核對的問題。 2019的5月9號,離發(fā)工資還有1天的時候,我的領(lǐng)導(dǎo)親切把我叫到辦公室跟我說:阿郭,我們公司要倒閉了,錢是沒有的啦,為了不耽誤你,你趕緊出去找工作吧。聽到這話,我虎軀一震,這已經(jīng)是第2個月沒工資了。 公...
摘要:文檔翻譯系列一安裝原文地址原文本系列是針對文檔進行的翻譯,因為自己在學(xué)習(xí)的時候,最開始通過看博客或者論壇等中文資料,有些內(nèi)容是零零散散的接收,并沒有給自己帶來很好的效果,所以后來決定把文檔的原文從頭到尾看一遍。 React文檔翻譯系列(一)安裝 原文地址:原文 本系列是針對React文檔進行的翻譯,因為自己在學(xué)習(xí)react的時候,最開始通過看博客或者論壇等中文資料,有些內(nèi)容是零零散散的...
摘要:我寫過一些開源項目,在開源方面有一些經(jīng)驗,最近開到了阮老師的微博,深有感觸,現(xiàn)在一個開源項目涉及的東西確實挺多的,特別是對于新手來說非常不友好最近我寫了一個,旨在從多方面快速幫大家搭建一個標(biāo)準(zhǔn)的庫,本文將已為例,介紹寫一個開源庫的知識 我寫過一些開源項目,在開源方面有一些經(jīng)驗,最近開到了阮老師的微博,深有感觸,現(xiàn)在一個開源項目涉及的東西確實挺多的,特別是對于新手來說非常不友好 show...
閱讀 4353·2021-09-26 10:11
閱讀 2725·2021-07-28 00:37
閱讀 3276·2019-08-29 15:29
閱讀 1255·2019-08-29 15:23
閱讀 3187·2019-08-26 18:37
閱讀 2540·2019-08-26 10:37
閱讀 648·2019-08-23 17:04
閱讀 2401·2019-08-23 13:44