您好,登錄后才能下訂單哦!
這篇“Webpack是怎么工作的”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Webpack是怎么工作的”文章吧。
Webpack是一款模塊打包工具。它為不同的依賴創(chuàng)建模塊,將其整體打包成可管理的輸出文件。這一點(diǎn)對(duì)于單頁(yè)面應(yīng)用(如今Web應(yīng)用的事實(shí)標(biāo)準(zhǔn))來(lái)說(shuō)特別有用。
假設(shè)我們有一個(gè)可以執(zhí)行兩個(gè)簡(jiǎn)單數(shù)學(xué)任務(wù)(加法和乘法)的應(yīng)用程序,為了方便維護(hù),我們決定切分這些函數(shù)到不同的文件中去。
index.html
<html>
<head>
<script src="src/sum.js"></script>
<script src="src/multiply.js"></script>
<script src="src/index.js"></script>
</head>
</html>
index.js
var totalMultiply = multiply(5, 3);
var totalSum = sum(5, 3);
console.log('Product of 5 and 3 = ' + totalMultiply);
console.log('Sum of 5 and 3 = ' + totalSum);
multiply.js
var multiply = function (a, b) {
var total = 0;
for (var i = 0; i < b; i++) {
total = sum(a, total);
}
return total;
};
sum.js
var sum = function (a, b) {
return a + b;
};
這個(gè)應(yīng)用程序的輸出應(yīng)該是:
Product of 5 and 3 = 15
Sum of 5 and 3 = 8
我們不能僅僅只是使用工具,而不知道這些工具能幫助我們做什么。那么,Webpack幫我們做了什么呢?
用模塊來(lái)拯救依賴
在上面的代碼中,我們可以看到,multiply.js與index.js均依賴于sum.js。因此,如果index.html導(dǎo)入依賴時(shí)使用了錯(cuò)誤的順序,那么我們的應(yīng)用就無(wú)法工作。舉個(gè)例子,如果index.js最先被導(dǎo)入,或者sum.js在multiply.js之后被導(dǎo)入,都會(huì)得到錯(cuò)誤。
基于上面的例子,讓我們想象一下,一個(gè)真實(shí)的Web應(yīng)用往往可能會(huì)包含多達(dá)幾十個(gè)依賴項(xiàng),這些依賴項(xiàng)之間還可能存在依賴關(guān)系,維護(hù)這些依賴項(xiàng)之間的順序想想就讓人窒息。這里還可能存在變量被其它依賴覆蓋的風(fēng)險(xiǎn),而這將會(huì)導(dǎo)致難以發(fā)現(xiàn)的BUG。
為了解決這個(gè)痛點(diǎn),Webpack會(huì)將依賴轉(zhuǎn)換為作用域更小的模塊,從而避免變量被覆蓋。依賴轉(zhuǎn)換為模塊帶來(lái)的額外好處是,Webpack可以為我們管理這些依賴。具體做法是,Webpack會(huì)在需要時(shí),把依賴模塊引入進(jìn)來(lái),并匹配對(duì)應(yīng)的作用域。
通過(guò)打包來(lái)減少HTTP請(qǐng)求次數(shù)
我們還是回看一下index.html,這個(gè)文件中我們需要下載三個(gè)獨(dú)立的文件。當(dāng)然這里文件比較少還能夠應(yīng)付,但還是之前提到的問題,真實(shí)的Web應(yīng)用中,依賴項(xiàng)可能會(huì)很多,而這將會(huì)導(dǎo)致用戶不得不等待所有依賴項(xiàng)挨個(gè)下載完成后,主應(yīng)用才能運(yùn)行。
而這就引出了Webpack的另一特性——打包。Webpack可以將所有的依賴打包成一個(gè)文件,而這就意味著,用戶只需要下載一個(gè)依賴項(xiàng),主應(yīng)用就可以運(yùn)行。
綜上所述,Webpack的主要特性就是打包和模塊化。通過(guò)使用插件和加載器,我們可以擴(kuò)展Webpack的這兩大特性。
我們將使用CommonJS模塊語(yǔ)法,作為初始設(shè)置。當(dāng)然,這里也有諸如AMD,ES2015等其它選擇,但這里我們將先使用CommonJS,稍后遷移到ES2015。
CommonJS將模塊導(dǎo)出,使得其它代碼可以使用導(dǎo)出模塊中的函數(shù)或變量。我們可以通過(guò)require
將導(dǎo)出模塊中的值讀出來(lái)。
index.html
<html>
<head>
<script src="./dist/bundle.js""></script>
</head>
</html>
index.js
var multiply = require('./multiply');
var sum = require('./sum');
var totalMultiply = multiply(5, 3);
var totalSum = sum(5, 3);
console.log('Product of 5 and 3 = ' + totalMultiply);
console.log('Sum of 5 and 3 = ' + totalSum);
multiply.js
var sum = require('./sum');
var multiply = function (a, b) {
var total = 0;
for (var i = 0; i < b; i++) {
total = sum(a, total);
}
return total;
};
module.exports = multiply;
sum.js
var sum = function (a, b) {
return a + b;
};
module.exports = sum;
觀察上面的代碼,不難發(fā)現(xiàn),為了讓函數(shù)sum
與函數(shù)multiply
能夠被使用,我們?cè)?em>sum.js與multiply.js腳本中,導(dǎo)出了這兩個(gè)函數(shù)。這里有個(gè)細(xì)節(jié),不知道大家是否注意到了,在index.html中我們現(xiàn)在僅需要導(dǎo)入一個(gè)bundle.js文件。
這可幫大忙了!我們現(xiàn)在不再需要關(guān)注依賴的順序,可以暴露我們想暴露的內(nèi)容,并使得其它內(nèi)容仍然保持私有。同時(shí),我們現(xiàn)在僅需要導(dǎo)入一個(gè)文件,而不是三個(gè),這有助于提高應(yīng)用的加載速度。
Webpack的初始配置
為了實(shí)現(xiàn)我們上面要達(dá)到的效果,我們需要對(duì)Webpack做一些初始的配置。
var path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, './dist/'),
filename: 'bundle.js'
}
}
這里我們實(shí)現(xiàn)了一個(gè)最簡(jiǎn)單的配置。我們至少需要告訴Webpack,我們應(yīng)用的入口在哪,輸出結(jié)果應(yīng)該是什么。我們來(lái)詳細(xì)看看每個(gè)屬性所代表的含義。
entry
: 這個(gè)屬性表示應(yīng)用的入口。入口就意味著,這是我們加載程序和程序邏輯的起點(diǎn)。Webpack將從這個(gè)入口開始,遍歷整棵依賴樹。根據(jù)遍歷結(jié)果建立一個(gè)依賴間關(guān)系圖,并創(chuàng)建需要的模塊。
output.path
: 這個(gè)屬性表示存放打包結(jié)果的絕對(duì)路徑。這里為了方便使用,我們采用了Node.js自帶的函數(shù)path
,這個(gè)函數(shù)能夠根據(jù)我們程序所處的位置,動(dòng)態(tài)的創(chuàng)建絕對(duì)路徑。其中,__dirname
是Node.js的一個(gè)工具變量,它表示當(dāng)前文件的目錄名。
output.filename
: 這個(gè)屬性表示打包結(jié)果的文件名。它的名字可以是任意的,只不過(guò)我們習(xí)慣叫它bundle.js
。
來(lái)看看bundle.js
閱讀生成的bundle.js
代碼,可以給我們帶來(lái)一些啟發(fā)。
// the webpack bootstrap
(function (modules) {
// The module cache
var installedModules = {};
// The require function
function __webpack_require__(moduleId) {
// Check if module is in cache
// Create a new module (and put it into the cache)
// Execute the module function
// Flag the module as loaded
// Return the exports of the module
}
// expose the modules object (__webpack_modules__)
// expose the module cache
// Load entry module and return exports
return __webpack_require__(0);
})
/************************************************************************/
([
// index.js - our application logic
/* 0 */
function (module, exports, __webpack_require__) {
var multiply = __webpack_require__(1);
var sum = __webpack_require__(2);
var totalMultiply = multiply(5, 3);
var totalSum = sum(5, 3);
console.log('Product of 5 and 3 = ' + totalMultiply);
console.log('Sum of 5 and 3 = ' + totalSum);
},
// multiply.js
/* 1 */
function (module, exports, __webpack_require__) {
var sum = __webpack_require__(2);
var multiply = function (a, b) {
var total = 0;
for (var i = 0; i < b; i++) {
total = sum(a, total);
}
return total;
};
module.exports = multiply;
},
// sum.js
/* 2 */
function (module, exports) {
var sum = function (a, b) {
return a + b;
};
module.exports = sum;
}
]);
從上面的代碼可以看出,Webpack把每一個(gè)js腳本都封裝到一個(gè)模塊中,并把這些模塊放進(jìn)數(shù)組中。模塊數(shù)組被傳入Webpack的引導(dǎo)程序中,引導(dǎo)程序會(huì)把這些模塊加入Webpack并執(zhí)行,使得模塊可用。
這里bundle.js
返回的是__webpack_require__(0)
,而這剛好對(duì)應(yīng)了模塊數(shù)組中的index.js
部分?;诖宋覀兺瑯涌梢缘玫秸_的運(yùn)行結(jié)果,而不需要處理依賴管理,下載依賴的次數(shù)也僅需要一次。
Loader讓W(xué)ebpack更好用
Webpack僅能理解最基本的JavaScript ES5代碼,它自身僅支持創(chuàng)建模塊并打包JavaScript ES5。如果我們不僅僅局限于JavaScript ES5,例如我們想使用ES2015,這就需要告訴Webpack如何處理ES2015。這里我們的處理方式往往是,我們需要將其它語(yǔ)言(如TypeScript)或其它版本(如ES2015)預(yù)處理成JavaScript ES5,再讓W(xué)ebpack做打包。這里就需要使用Babel來(lái)做轉(zhuǎn)換,把ES2015轉(zhuǎn)換為ES5(當(dāng)然Babel能做的事情遠(yuǎn)不止如此)。
為了說(shuō)明這個(gè)過(guò)程,我們使用ES2015重寫之前的功能。
index.js
import multiply from './multiply';
import sum from './sum';
const totalMultiply = multiply(5, 3);
const totalSum = sum(5, 3);
console.log(`Product of 5 and 3 = ${totalMultiply}`);
console.log(`Sum of 5 and 3 = ${totalSum}`);
multiply.js
import sum from './sum';
const multiply = (a, b) => {
let total = 0;
for(let i=0;i<b;i++) {
total = sum(a, total);
}
return total;
};
export default multiply;
sum.js
const sum = (a, b) => a + b;
export default sum;
這里我們使用了很多ES2015的新特性,例如箭頭函數(shù)、const
關(guān)鍵字、模板字符串和ES2015的導(dǎo)入導(dǎo)出。ES2015的代碼Webpack無(wú)法處理,所以我們需要Babel來(lái)進(jìn)行轉(zhuǎn)換。想要讓Babel配合Webpack完成工作,我們就需要用到Babel Loader。事實(shí)上,Loader就是Webpack處理JavaScript ES5以外內(nèi)容的方式。有了加載器,我們就可以讓W(xué)ebpack處理各式各樣的文件。
想要在Webpack中使用Babel Loader,我們還需要三個(gè)Babel依賴:
babel-loader
: 提供Babel與Webpack之間的接口;
babel-core
: 提供讀取和解析代碼的功能,并生成對(duì)應(yīng)的輸出;
babel-preset-es2015
: 提供將ES2015轉(zhuǎn)換為ES5的Babel規(guī)則;
在Webpack中配置Babel Loader的代碼,差不多是下面這樣子:
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, './dist/'),
filename: 'bundle.js'
},
module: {
loaders: [
{
test: /.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
query: {
presets: ['es2015']
}
}
]
}
};
這段代碼你可以在webpack.config.js
中找到。值得注意的是,Webpack中是支持同時(shí)存在多個(gè)Loader的,所以提供的值是一個(gè)數(shù)組。接著,還是讓我們來(lái)看看每個(gè)屬性代表的含義。
test
: 我們只希望Loader處理JavaScript文件,這里通過(guò)一個(gè)正則表達(dá)式匹配.js文件;
loader
: 要使用的Loader,這里使用了babel-loader
;
exclude
: 哪些文件不需要被處理,這里我們不希望Babel處理node_modules下的任何文件;
query.presets
: 我們需要使用哪個(gè)規(guī)則,這里我們使用Babel轉(zhuǎn)換ES2015的規(guī)則;
配置好這些內(nèi)容后,再次查看打包生成的bundle.js
,其中的內(nèi)容看起來(lái)就像下面這樣:
/* 2 */
function(module, exports) {
var sum = function sum(a, b) {
return a + b;
};
module.exports = sum;
}
可以看到,Babel Loader已經(jīng)把ES2015的代碼變成了ES5的代碼。
接下來(lái),讓我們拓展上面的例子,輸出計(jì)算結(jié)果。我們將在頁(yè)面上創(chuàng)建一個(gè)body
,然后把乘積與加和的結(jié)果添加到span
中。
import multiply from './multiply';
import sum from './sum';
const totalMultiply = multiply(5, 3);
const totalSum = sum(5, 3);
// create the body
const body = document.createElement("body");
document.documentElement.appendChild(body);
// calculate the product and add it to a span
const multiplyResultsSpan = document.createElement('span');
multiplyResultsSpan.appendChild(document.createTextNode(`Product of 5 and 3 = ${totalMultiply}`));
// calculate the sum and add it to a span
const sumResultSpan = document.createElement('span');
sumResultSpan.appendChild(document.createTextNode(`Sum of 5 and 3 = ${totalSum}`));
// add the results to the page
document.body.appendChild(multiplyResultsSpan);
document.body.appendChild(sumResultSpan);
這段代碼的輸出結(jié)果,應(yīng)該與之前是一致的,區(qū)別僅在于顯示在頁(yè)面上。
Product of 5 and 3 = 15 Sum of 5 and 3 = 8
我們可以使用CSS來(lái)美化這個(gè)結(jié)果,比如,我們可以讓每個(gè)結(jié)果都獨(dú)占一行,并且給每個(gè)結(jié)果都加上邊框。為了實(shí)現(xiàn)這一點(diǎn),我們可以使用如下的CSS代碼。
span {
border: 5px solid brown;
display: block;
}
我們需要將這個(gè)CSS也導(dǎo)入應(yīng)用中。這里最簡(jiǎn)單的解決方案是,在我們的html中添加一個(gè)link
標(biāo)簽。但有了Webpack提供的強(qiáng)大功能,我們可以先導(dǎo)入它,再用Webpack來(lái)處理這個(gè)樣式。
在代碼中導(dǎo)入CSS帶來(lái)的另一個(gè)好處是,開發(fā)者可以清晰的看到CSS與其使用之間的關(guān)聯(lián)。這里需要注意的是,CSS的作用域并不局限于它所導(dǎo)入的模塊本身,其作用域仍然是全局的,但從開發(fā)者的角度看,這樣使用更加清晰。
import multiply from './multiply';
import sum from './sum';
// import the CSS we want to use here
import './math_output.css';
const totalMultiply = multiply(5, 3);
const totalSum = sum(5, 3);
// create the body
const body = document.createElement("body");
document.documentElement.appendChild(body);
// calculate the product and add it to a span
const multiplyResultsSpan = document.createElement('span');
multiplyResultsSpan.appendChild(document.createTextNode(`Product of 5 and 3 = ${totalMultiply}`));
// calculate the sum and add it to a span
const sumResultSpan = document.createElement('span');
sumResultSpan.appendChild(document.createTextNode(`Sum of 5 and 3 = ${totalSum}`));
// add the results to the page
document.body.appendChild(multiplyResultsSpan);
document.body.appendChild(sumResultSpan);
這段代碼中,與前面代碼的唯一區(qū)別在于,我們導(dǎo)入了CSS。我們需要兩個(gè)Loader來(lái)處理我們的CSS:
css-loader
: 用于處理CSS導(dǎo)入,具體來(lái)說(shuō),獲取導(dǎo)入的CSS并加載CSS文件內(nèi)容;
style-loader
: 獲取CSS數(shù)據(jù),并添加它們到HTML文檔中;
現(xiàn)在我們?cè)?code>webpack.config.js中的Webpack配置看起來(lái)像這樣:
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, './dist/'),
filename: 'bundle.js'
},
module: {
loaders: [
{
test: /.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
query: {
presets: ['es2015']
}
},
{
test: /.css$/,
loaders: ['style-loader', 'css-loader']
}
]
}
};
我們還是來(lái)看看新增的CSS配置屬性所表示的內(nèi)容。
test
: 我們需要告訴Loader,我們只需要它處理CSS文件。這里的正則表達(dá)式僅匹配CSS文件。
loaders
: 這里與前面不同的是,我們使用了多個(gè)Loader。還有一個(gè)需要注意的細(xì)節(jié)是,Webpack從右向左處理loader,因此css-loader
處理的結(jié)果(讀出CSS文件內(nèi)容)會(huì)被傳遞給style-loader
,最終得到的是style-loader
的處理結(jié)果(將樣式添加到HTML文檔中)。
假如我們現(xiàn)在需要提取CSS,并輸出到一個(gè)文件中,再導(dǎo)入該文件。為了實(shí)現(xiàn)這一點(diǎn),我們就要用到Plugin。Loader的作用在于,在數(shù)據(jù)被打包輸出前進(jìn)行預(yù)處理。而Plugin則可以阻止預(yù)處理的內(nèi)容直接出現(xiàn)在我們的打包結(jié)果中。
我們的Webpack配置現(xiàn)在變成了這樣:
const path = require('path');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, './dist/'),
filename: 'bundle.js'
},
module: {
loaders: [
{
test: /.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
query: {
presets: ['es2015']
}
},
{
test: /.css$/,
loader: ExtractTextPlugin.extract('css-loader')
}
]
},
plugins: [
new ExtractTextPlugin('style.css')
]
};
在這段代碼的頂部,我們導(dǎo)入了ExtractTextPlugin
,并使用這個(gè)插件改造了之前的CSS Loader。這里的作用是,css-loader
的處理結(jié)果不再直接返回給Webpack,而是傳遞給ExtractTextPlugin
。在底部我們配置了這個(gè)Plugin。
這里配置的作用是,對(duì)于傳遞給ExtractTextPlugin
的CSS樣式數(shù)據(jù),將會(huì)被保存在名為style.css
的文件中。這樣做的好處與之前處理JavaScript時(shí)一樣,我們可以將多個(gè)獨(dú)立的CSS文件合并為一個(gè)文件,從而減少加載樣式時(shí)的下載次數(shù)。
最終我們可以直接使用我們合并好的CSS,實(shí)現(xiàn)和之前一致的效果。
<html>
<head>
<link rel="stylesheet" href="dist/style.css"/>
<script src="./dist/bundle.js""></script>
</head>
</html>
現(xiàn)在我們開始嘗試向應(yīng)用中添加圖片,并讓W(xué)ebpack來(lái)協(xié)助我們處理這些圖片。這里我們添加了兩張圖片,一個(gè)用于求和,一個(gè)用于求積。為了讓W(xué)ebpack有能力處理這些圖片,我們使用這兩個(gè)Loader:
image-webpack-loader
: 嘗試幫助我們自動(dòng)壓縮圖片體積;
url-loader
: 如果image-webpack-loader
的輸出圖片體積小,就內(nèi)聯(lián)使用這些圖片,如果image-webpack-loader
的輸出圖片體積大,就將圖像包含在輸出目錄中;
我們準(zhǔn)備了兩張圖片,用于求積的圖片(multiply.png)相對(duì)較大,用于求和的圖片(sum.png)相對(duì)較小。首先,我們添加一個(gè)圖片工具方法,這個(gè)方法會(huì)為我們創(chuàng)建圖片,并將圖片添加到文檔中。
image_util.js
const addImageToPage = (imageSrc) => {
const image = document.createElement('img');
image.src = imageSrc;
image.style.height = '100px';
image.style.width = '100px';
document.body.appendChild(image);
};
export default addImageToPage;
接著,讓我們導(dǎo)入這個(gè)圖片工具方法,以及我們想要添加到index.js中的圖片。
import multiply from './multiply';
import sum from './sum';
// import our image utility
import addImageToPage from './image_util';
// import the images we want to use
import multiplyImg from '../images/multiply.png';
import sumImg from '../images/sum.png';
// import the CSS we want to use here
import './math_output.css';
const totalMultiply = multiply(5, 3);
const totalSum = sum(5, 3);
// create the body
const body = document.createElement("body");
document.documentElement.appendChild(body);
// calculate the product and add it to a span
const multiplyResultsSpan = document.createElement('span');
multiplyResultsSpan.appendChild(document.createTextNode(`Product of 5 and 3 = ${totalMultiply}`));
// calculate the sum and add it to a span
const sumResultSpan = document.createElement('span');
sumResultSpan.appendChild(document.createTextNode(`Sum of 5 and 3 = ${totalSum}`));
// add the results to the page
addImageToPage(multiplyImg);
document.body.appendChild(multiplyResultsSpan);
addImageToPage(sumImg);
document.body.appendChild(sumResultSpan);
最后,我們還是來(lái)修改webpack.config.js
,配置兩個(gè)新的Loader來(lái)處理這些圖片。
const path = require('path');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, './dist/'),
filename: 'bundle.js',
publicPath: 'dist/'
},
module: {
loaders: [
{
test: /.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
query: {
presets: ['es2015']
}
},
{
test: /.css$/,
loader: ExtractTextPlugin.extract('css-loader')
},
{
test: /.png$/,
loaders: [
'url-loader?limit=5000',
'image-webpack-loader'
]
}
]
},
plugins: [
new ExtractTextPlugin('style.css')
]
};
還是老規(guī)矩,我們來(lái)看看新增的參數(shù)都表示什么含義。
output.publicPath
: 讓url-loader
知道,保存到磁盤的文件需要添加指定的前綴。例如,我們需要保存一個(gè)output_file.png
,那么最終保存的路徑應(yīng)該是dist/output_file.png
;
test
: 還是和之前一樣,通過(guò)正則表達(dá)式匹配圖像文件,非圖像文件不處理;
loaders
: 這里還是要再?gòu)?qiáng)調(diào)一下,Webpack從右向左處理loader,因此image-webpack-loader
的處理結(jié)果將會(huì)被傳遞給url-loader
繼續(xù)處理。
現(xiàn)在我們執(zhí)行Webpack打包,會(huì)得到下面三個(gè)東西。
38ba485a2e2306d9ad96d479e36d2e7b.png
bundle.js
style.css
這里的38ba485a2e2306d9ad96d479e36d2e7b.png
實(shí)際上就是我們的大圖片multiply.png
,較小的圖片sum.png
會(huì)被內(nèi)聯(lián)到bundle.js
中,就像下面這樣。
module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAMAAAACDyzWAAAC6FBMVEUAuv8AgL...."
這其實(shí)相當(dāng)于
img.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAMAAAACDyzWAAAC6FBMVEUAuv8AgL..."
以上就是關(guān)于“Webpack是怎么工作的”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。