Ⅰ htmlwebpackplugin配置後直接運行不顯示內容
win+r,然後找到菜單標簽,運行cmd,回車,關掉窗口,就有內容了。
快捷鍵win+r打開運行窗口,然後點擊小三角看到是空記錄的,我們找到開始按鈕,右鍵選擇屬性,再出的界面點擊開始菜單標簽,再出的界面點擊開始菜單標簽,然後我們再次打開運行窗口輸入CMD命令,按回車,然後關掉該窗口,點擊三角號,這回我們發現有記錄了。
Ⅱ webpack build命令怎麼寫
Compilation 源文件
插件基本結構
Plugins是可以用自身原型方法apply來實例化的對象。apply只在安裝插件被Webpack compiler執行一次。apply方法傳入一個Webpck compiler的引用,來訪問編譯器回調。
一個簡單的插件結構:
function HelloWorldPlugin(options) {
// Setup the plugin instance with options...
}
HelloWorldPlugin.prototype.apply = function(compiler) {
compiler.plugin('done', function() {
console.log('Hello World!');
});
};
mole.exports = HelloWorldPlugin;
安裝插件時, 只需要將它的一個實例放到 Webpack config plugins 數組裡面:
var HelloWorldPlugin = require('hello-world');
var webpackConfig = {
// ... config settings here ...
plugins: [
new HelloWorldPlugin({options: true})
]
};
訪問 compilation
使用compiler對象,你可能需要綁定帶有各個新compilation的引用的回調函數。這些compilation提供回調函數連接成許多構建過程中的步驟。
function HelloCompilationPlugin(options) {}
HelloCompilationPlugin.prototype.apply = function(compiler) {
// Setup callback for accessing a compilation:
compiler.plugin("compilation", function(compilation) {
// Now setup callbacks for accessing compilation steps:
compilation.plugin("optimize", function() {
console.log("Assets are being optimized.");
});
});
});
mole.exports = HelloCompilationPlugin;
更多關於在compiler, compilation等對象中哪些回調有用,看一下
plugins API
非同步編譯插件
有些compilation插件的步驟時非同步的,並且會傳入一個當你的插件運行完成時候必須調用的回調函數。
function HelloAsyncPlugin(options) {}
HelloAsyncPlugin.prototype.apply = function(compiler) {
compiler.plugin("emit", function(compilation, callback) {
// Do something async...
setTimeout(function() {
console.log("Done with async work...");
callback();
}, 1000);
});
});
mole.exports = HelloAsyncPlugin;
例子
我們了解了Webpack compiler和各個compilations,我們就可以用它們來創造無盡的可能。我們可以重定當前文件的格式,生成一個衍生文件,或者製造出一個全新的assets
下面我們將寫一個簡單的插件,生成一個filelist.md文件,裡面的內容是,列出我們build的所有asset 文件。
function FileListPlugin(options) {}
FileListPlugin.prototype.apply = function(compiler) {
compiler.plugin('emit', function(compilation, callback) {
// Create a header string for the generated file:
var filelist = 'In this build:\n\n';
// Loop through all compiled assets,
// adding a new line item for each filename.
for (var filename in compilation.assets) {
filelist += ('- '+ filename +'\n');
}
// Insert this list into the Webpack build as a new file asset:
compilation.assets['filelist.md'] = {
source: function() {
return filelist;
},
size: function() {
return filelist.length;
}
};
callback();
});
};
mole.exports = FileListPlugin;
Ⅲ npm安裝webpack,運行webpack-v,提示node不是內部或外部命令,運行node -v是正常的
重新安裝webpack 安裝全局的
使用 這個命令
npm i webpack -g
Ⅳ webpack可以提高代碼的運行效率嗎
工具常見模塊化開發規范:CMD(seaJS)AMD(requireJS)一、webpack環境搭建1.webpack安裝首先需要安裝nodeJS,先在nodeJS官網下載,進行NodeJS安裝下載地址https://nodejs.org/en/download/下載完畢後,進行安裝,一切都以默認的選擇即可2.npm安裝安裝完畢後,打開cmd工具,輸入命令npminstall--savemocha等待安裝完畢3.webpack安裝cmd工具中,輸入命令npminstallwebpack-g執行命令安裝webpack到此webpack安裝完畢,可以使用webpack-h來查看版本號到此,webpack安裝完成二、webpack打包1.打開cmd工具,進入你的開發文件夾,其中此文件夾必須包含webpack.config.js文件,config配置參考如下varwebpack=require("webpack")mole.exports={entry:{"mcDemoMain":"./mcDemoMain.js"//直接require進來的文件會直接打包到這個文件中,如require('./common/Enum'),延遲載入的文件則不會,如require("bundle?lazy&name=demo!./demo/demo1")},output:{path:"../../dist/demo/1.0",//設置打包後的js的輸出位置filename:"[name].js",//和入口文件的名字相同chunkFilename:"[name].young.js",//值模塊里需要單獨打包的文件require.ensure//path:path.join(__dirname,'static/js/app/dist'),//設置打包後的js的輸出位置//filename:"[name].[hash].js",//和入口文件的名字相同publicPath:"[sDomain]static/dist/demo/1.0/"//瀏覽器會從這個目錄開始查找模塊},mole:{loaders:[//{test:/\.css$/,loader:"style!css"},//{test:/\.js[x]?$/,exclude:/node_moles/,loader:'babel-loader',query:{presets:'es2015'}},]},plugins:[newwebpack.BannerPlugin('文件頂部注釋說明'),//newwebpack.IgnorePlugin(/\.\/AsnyMoleA.js$/),//排除不想打包進去的插件//newwebpack.ProvidePlugin({//這是把jquery掛到全局上,不用每個模塊都去require//"AsnyMoleA":'../../../dist/demo/AsnyMoleA.js',//}),//newwebpack.optimize.CommonsChunkPlugin('common.js')//有多個入口文件的話提取公共部分,利用瀏覽器緩存然後commonsPlugin可以用於分析模塊的共用代碼,單獨打一個包出來:],resolve:{//molesDirectories:'C:\Users\Administrator\AppData\Roaming\npm\node_moles',//["C:\Users\Administrator\AppData\Roaming\npm\node_moles"],//root:'C:\Users\Administrator\AppData\Roaming\npm\node_moles',alias:{//jquery:path.join(__dirname,'dev/jquery/jquery.js'),//AsnyMoleA:"../../../dist/demo/start/commom/AsnyMoleA.js",//在正常情況下我們以CommonJS風格引用avalon,以require('avalon')//'../avalon':path.join(__dirname,'dev/avalon/avalon.js')//由於oniui都以是../avalon來引用avalon的,需要在這里進行別名}},//externals:{//'AsnyMoleA':'AsnyMoleA'//}}2.cmd進入開發目錄後,輸入webpack就可以進行打包了,如果顯示以下則表示成功
Ⅳ 怎麼解決webpack@1
1. 我是否需要系統管理員許可權才能安裝ISE WebPACK?
Windows2000用戶必須是系統管理員或許可權高的用戶(power user )才能進行注冊。 如果您與第三方軟體,如LeonardoSpectrum 或Model Sim XE III (MXE-III)一起使用ISE WebPACK,您需要修改注冊表. 對於那些位於防火牆後,或公司有限制的人,如果您有關於代理伺服器的問題,請咨詢您的系統管理員。
在Red Hat Enterprise 3 Linux 上需要您以'root'登錄才能成功安裝 ISE WebPACK. 因為安裝是在系統上安裝驅動器,所以除非您以'root'登錄,否則安裝不會成功。
[返回頁首]
2. ISE WebPACK可以安裝到現有Xilinx工具所在的硬碟上嗎?
可以,如果ISE WebPACK工具都安裝到自己的目錄中,他們就可以安裝到現有Xilinx工具所在的同一硬碟上。
[返回頁首]
3. 在 ISE Foundation 中包含了哪些 ISE WebPACK所不包含的工具?
沒有, ISE WebPACK 包含了榮獲眾多獎項的 ISE Foundation 設計工具中全部的特性和功能。 區別僅僅在於 ISE Foundation 支持所有 FPGA 家族的器件。 ISE WebPACK 不支持某些大型 FPGA 器件。
[返回頁首]
4. 我如何開始一個項目?
1 - 從項目瀏覽器中,選擇File -> New Project。 將會出現 New Project對話框。
2 - 在項目名稱框中,鍵入您項目的名稱。
3 - 通過指定項目位置選擇項目文件的目錄。 您可鍵入路徑,或者點擊瀏覽按鈕找到一個放置項目文件的目錄。
4 - 點擊Device Family值,顯示出已安裝的Xilinx系列器件。
5 - 從列表中選擇一個系列,然後點擊第二列中的Device框,再選擇特定的器件。 重復上述過程選擇器件封裝和速度級.
6 - 選擇Design Flow 框並選擇希望用於設計綜合的語言和編譯器。
7 - 一旦建立好您的項目,您可選擇項目瀏覽器中的Project 菜單項,您可創建一個新的源設計文件或者增加一個現有的源文件。
有關這些過程的更多信息可從Help菜單>> ISE Help Contents 選項中找到。
[返回頁首]
5. 無法打開安裝(setup)程序。 錯誤編碼 - 2147024890 下載網頁, 請稍侯. 這錯誤是什麼意思?
這錯誤信息是在你的個人電腦未安裝 IE 瀏覽器,而你試圖用Netscape打開Web Install 下載網頁時所發生。 即使你不用,也必需安裝 IE 瀏覽器。
[返回頁首]
器件和功能支持
1. ISE WebPACK/ WebFITTER 應用支持什麼器件?
ISE WebPACK支持下表中所列的器件:
FPGA
Virtex™ 系列 Virtex-E: XCV50E - XCV600E
Virtex-II: XC2V40 - XC2V600
Virtex-II Pro: XC2VP2 - XC2VP7
Virtex-4:
LX: XC4VLX15, XC4VLX25, XC4VSX25、XC4VFX12
Spartan™ 系列 Spartan-II: 全部
Spartan-IIE: 全部
Spartan-3: XC3S50 - XC3S1500
Spartan-3E: 全部
Spartan-3L: XC3S1000L, XC3S1500L
CPLD
CoolRunner-II
CoolRunner-IIA
CoolRunner-XPLA3 全部
XC9500 / XL / XV 系列 全部
[返回頁首]
2. ISE WebPACK提供哪些功能和特點?
參見ISE WebPACK性能支持矩陣。
[返回頁首]
3. 就適配或布局性能來說,ISE WebPACK和其它Xilinx工具間有什麼區別嗎?
沒有,ISE WebPACK 軟體包含與其它ISE系列成員同樣的PLD布線演算法。 因此具有同樣的性能。
[返回頁首]
4. ModelSim Xilinx 版- III (MXE-III) Starter的使用限制是什麼?
MXE-III Starter的調試代碼為10,000 行。 超過這一限制,進程開始慢下來,但不會停止。 該軟體的用途依賴於使用的代碼類型和模擬方式(功能或時序)。
[返回頁首]
5. 僅僅想從獨立的攜帶型電腦中進行器件編程需要什麼軟體?
ISE WebPACK 提供了模塊化安裝方法,允許您選擇安裝所需要的軟體。 在 ISE WebPACK 的主頁選擇 WebInstall 並按照 CPLD 編程工具安裝的選項進行。
[返回頁首]
6. 我如何重新設置CPLD器件的速度等級? FPGA呢?
對CPLD和FPGA ,速度等級都是在項目創建時做為器件項目屬性的一部分選擇的。 要改變器件的速度等級,雙擊項目所選擇的器件並選擇不同速度等級的器件即可。
[返回頁首]
雜項
1. ISE WebPACK支持ABEL器件的模擬嗎? 如何支持?
支持的。ISE WebPACK 集成了ABEL 7.5版,以及ABEL-XST VHDL 和ABEL-XST Verilog設計流程,因此可支持模擬.
請看設計流程中的項目屬性菜單。 這些流程提供了Verilog 和VHDL網表,這些網表可在HDL Bencher中進行功能模擬,並可利用ModelSim XE starter使用進行適配後模擬。
[返回頁首]
2. 我如何獲得舊的ISE WebPACK軟體以重新編譯老設計?
ISE Classics頁有與所有舊軟體工具的鏈接。 這些舊版本的設計軟體可根據需要下載。 為了避免不同版本的軟體沖突,這些老版本軟體應當安裝到與現有ISE WebPACK版本不同的目錄中。
[返回頁首]
3. 對基於Web的應用提供支持嗎?
基於Web的工具利用基於Web的支持。 享有 ISE Foundation 和其他產品相同的熱線專家提供的在線技術支持,但是其在線問題的優先順序低於全付費軟體用戶。 所有問題都會在10天內回答。 求助快速服務,我們提供直接的網路工具支持信息包,請與您當地的Xilinx代表處聯系購買。
[返回頁首]
4. ISE WebPACK將在什麼時候更新?
ISE WebPACK 是Xilinx 軟體配置規劃的一部分. ISE WebPACK 將使用與ISE Foundation 或ISE BaseX™相同的安裝程序. 這一改進還允許ISE WebPACK 利用軟體服務包進行升級。 如果您下載了WebInstall小程序,該程序調用時將自動更新您的軟體
[返回頁首]
5. 我如何通過命令行運行ISE WebPACK?
ISE WebPACK命令行操作僅適用於CPLD。 您必須首先保證Xilinx環境變數設置正確。 在安裝過程中,有自動設置環境變數的選項。 如果沒有選擇該選項,那麼您需要手動設置環境變數指向ISE WebPACK安裝位置。
XFLOW是允許您自動化 Xilinx實施和模擬流程的命令行工具。 XFLOW可將設計文件、流程文件和選項文件作為輸入。 如果想了解有關這方面的更多信息,請參考在線幫助手冊中 開發系統參考指南部分的內容。
[返回頁首]
6. 什麼平台支持ISE WebPACK?
支持的操作系統有: Windows XP, Windows 2000 Service Pack 2 (中文, 韓文, 英文, 日文) 和 Red Hat Enterprise 3 Linux.
Ⅵ webpack執行機制流程是怎麼樣的
幾乎所有業務的開發構建都會用到 webpack 。的確,作為模塊載入和打包神器,只需配置幾個文件,載入各種 loader 就可以享受無痛流程化開發。但對於 webpack 這樣一個復雜度較高的插件集合,它的整體流程及思想對我們來說還是很透明的。那麼接下來我會帶你了解 webpack 這樣一個構建黑盒,首先來談談它的流程。 准備工作 1. webstorm 中配置 webpack-webstorm-debugger-script 在開始了解之前,必須要能對 webpack 整個流程進行 debug ,配置過程比較簡單。 先將 webpack-webstorm-debugger-script 中的軟體外包企業公司 置於 webpack.config.js 的同一目錄下,搭建好你的腳手架後就可以直接 Debug 這個 webstorm-debugger.js 文件了。 2. webpack.config.js 配置 估計大家對 webpack.config.js 的配置也嘗試過不少次了,這里就大致對這個配置文件進行個分析。 var path = require('path'); var node_moles = path.resolve(__dirname, 'node_moles'); var pathToReact = path.resolve(node_moles, 'react/dist/react.min.js'); mole.exports = { // 入口文件,是模塊構建的起點,同時每一個入口文件對應最後生成的一個 chunk。 entry: { bundle: [ 'webpack/hot/dev-server', 'webpack-dev-server/client?', path.resolve(__dirname, 'app/app.js') ], }, // 文件路徑指向(可加快打包過程)。 resolve: { alias: { 'react': pathToReact } }, // 生成文件,是模塊構建的終點,包括輸出文件與輸出路徑。 output: { path: path.resolve(__dirname, 'build'), filename: '[name].js', }, // 這里配置了處理各模塊的 loader ,包括 css 預處理 loader ,es6 編譯 loader,圖片處理 loader。 mole: { loaders: [ { test: /\.js$/, loader: 'babel', query: { presets: ['es2015', 'react'] } } ], noParse: [pathToReact] }, // webpack 各插件對象,在 webpack 的事件流中執行對應的方法。 plugins: [ new webpack.HotMoleReplacementPlugin(); ] }; 除此之外再大致介紹下 webpack 的一些核心概念: loader : 能轉換各類資源,並處理成對應模塊的載入器。loader 間可以串列使用。 chunk : code splitting後的產物,也就是按需載入的分塊,裝載了不同的mole。 對於mole和chunk的關系可以參照webpack官方的這張圖: plugin : webpack 的插件實體,這里以 UglifyJsPlugin 為例。 function UglifyJsPlugin(options) { this.options = options; } mole.exports = UglifyJsPlugin; UglifyJsPlugin.prototype.apply = function(compiler) { compiler.plugin("compilation", function(compilation) { compilation.plugin("build-mole", function(mole) { }); compilation.plugin("optimize-chunk-assets", function(chunks, callback) { // Uglify 邏輯 }); compilation.plugin("normal-mole-loader", function(context) { }); }); }; 在 webpack 中你經常可以看到 compilation.plugin('xxx', callback) ,你可以把它當作是一個事件的綁定,這些事件在打包時由 webpack 來觸發。 3. 流程總覽 在具體流程學習前,可以先通過這幅 webpack整體流程圖 了解一下大致流程(建議保存下來查看)。 shell 與 config 解析 每次在命令行輸入 webpack 後,操作系統都會去調用 ./node_moles/.bin/webpack 這個 shell 腳本。這個腳本會去調用./node_moles/webpack/bin/webpack.js 並追加輸入的參數,如 -p , -w 。(圖中 webpack.js 是 webpack 的啟動文件,而 $@ 是後綴參數) 在 webpack.js 這個文件中 webpack 通過 optimist 將用戶配置的 webpack.config.js 和 shell 腳本傳過來的參數整合成 options 對象傳到了下一個流程的控制對象中。 1. optimist 和 commander 一樣,optimist 實現了 node 命令行的解析,其 API 調用非常方便。 var optimist = require("optimist"); optimist .boolean("json").alias("json", "j").describe("json") .boolean("colors").alias("colors", "c").describe("colors") .boolean("watch").alias("watch", "w").describe("watch") ... 獲取到後綴參數後,optimist 分析參數並以鍵值對的形式把參數對象保存在 optimist.argv 中,來看看 argv 究竟有什麼? // webpack --hot -w { hot: true, profile: false, watch: true, ... } 2. config 合並與插件載入 在載入插件之前,webpack 將 webpack.config.js 中的各個配置項拷貝到 options 對象中,並載入用戶配置在 webpack.config.js 的 plugins 。接著 optimist.argv 會被傳入到 ./node_moles/webpack/bin/convert-argv.js 中,通過判斷 argv 中參數的值決定是否去載入對應插件。(至於 webpack 插件運行機制,在之後的運行機制篇會提到) ifBooleanArg("hot", function() { ensureArray(options, "plugins"); var HotMoleReplacementPlugin = require("../lib/HotMoleReplacementPlugin"); options.plugins.push(new HotMoleReplacementPlugin()); }); ... return options; options 作為最後返回結果,包含了之後構建階段所需的重要信息。 { entry: {},//入口配置 output: {}, //輸出配置 plugins: [], //插件集合(配置文件 + shell指令) mole: { loaders: [ [Object] ] }, //模塊配置 context: //工程路徑 ... } 這和 webpack.config.js 的配置非常相似,只是多了一些經 shell 傳入的插件對象。插件對象一初始化完畢, options 也就傳入到了下個流程中。 var webpack = require("../lib/webpack.js"); var compiler = webpack(options); 編譯與構建流程 在載入配置文件和 shell 後綴參數申明的插件,並傳入構建信息 options 對象後,開始整個 webpack 打包最漫長的一步。而這個時候,真正的 webpack 對象才剛被初始化,具體的初始化邏輯在 lib/webpack.js 中,如下: function webpack(options) { var compiler = new Compiler(); ...// 檢查options,若watch欄位為true,則開啟watch線程 return compiler; } ... webpack 的實際入口是 Compiler 中的 run 方法,run 一旦執行後,就開始了編譯和構建流程 ,其中有幾個比較關鍵的 webpack 事件節點。 compile 開始編譯 make 從入口點分析模塊及其依賴的模塊,創建這些模塊對象 build-mole 構建模塊 after-compile 完成構建 seal 封裝構建結果 emit 把各個chunk輸出到結果文件 after-emit 完成輸出 1. 核心對象 Compilation compiler.run 後首先會觸發 compile ,這一步會構建出 Compilation 對象: compilation類圖 這個對象有兩個作用,一是負責組織整個打包過程,包含了每個構建環節及輸出環節所對應的方法,可以從圖中看到比較關鍵的步驟,如 addEntry() , _addMoleChain() , buildMole() , seal() , createChunkAssets() (在每一個節點都會觸發 webpack 事件去調用各插件)。二是該對象內部存放著所有 mole ,chunk,生成的 asset 以及用來生成最後打包文件的 template 的信息。 2. 編譯與構建主流程 在創建 mole 之前,Compiler 會觸發 make,並調用 Compilation.addEntry 方法,通過 options 對象的 entry 欄位找到我們的入口js文件。之後,在 addEntry 中調用私有方法 _addMoleChain ,這個方法主要做了兩件事情。一是根據模塊的類型獲取對應的模塊工廠並創建模塊,二是構建模塊。 而構建模塊作為最耗時的一步,又可細化為三步: 調用各 loader 處理模塊之間的依賴 webpack 提供的一個很大的便利就是能將所有資源都整合成模塊,不僅僅是 js 文件。所以需要一些 loader ,比如 url-loader ,jsx-loader , css-loader 等等來讓我們可以直接在源文件中引用各類資源。webpack 調用 doBuild() ,對每一個 require() 用對應的 loader 進行加工,最後生成一個 js mole。 Compilation.prototype._addMoleChain = function process(context, dependency, onMole, callback) { var start = this.profile && +new Date(); ... // 根據模塊的類型獲取對應的模塊工廠並創建模塊 var moleFactory = this.dependencyFactories.get(dependency.constructor); ... moleFactory.create(context, dependency, function(err, mole) { var result = this.addMole(mole); ... this.buildMole(mole, function(err) { ... // 構建模塊,添加依賴模塊 }.bind(this)); }.bind(this)); }; 調用 acorn 解析經 loader 處理後的源文件生成抽象語法樹 AST Parser.prototype.parse = function parse(source, initialState) { var ast; if(!ast) { // acorn以es6的語法進行解析 ast = acorn.parse(source, { ranges: true, locations: true, ecmaVersion: 6, sourceType: "mole" }); } ... }; 遍歷 AST,構建該模塊所依賴的模塊 對於當前模塊,或許存在著多個依賴模塊。當前模塊會開辟一個依賴模塊的數組,在遍歷 AST 時,將 require() 中的模塊通過addDependency() 添加到數組中。當前模塊構建完成後,webpack 調用 processMoleDependencies 開始遞歸處理依賴的 mole,接著就會重復之前的構建步驟。 Compilation.prototype.addMoleDependencies = function(mole, dependencies, l, cacheGroup, recursive, callback) { // 根據依賴數組(dependencies)創建依賴模塊對象 var factories = []; for(var i = 0; i < dependencies.length; i++) { var factory = _this.dependencyFactories.get(dependencies[i][0].constructor); factories[i] = [factory, dependencies[i]]; } ... // 與當前模塊構建步驟相同 } 3. 構建細節 mole 是 webpack 構建的核心實體,也是所有 mole的 父類,它有幾種不同子類:NormalMole , MultiMole ,ContextMole , DelegatedMole 等。但這些核心實體都是在構建中都會去調用對應方法,也就是 build() 。來看看其中具體做了什麼: // 初始化mole信息,如context,id,chunks,dependencies等。 NormalMole.prototype.build = function build(options, compilation, resolver, fs, callback) { this.buildTimestamp = new Date().getTime(); // 構建計時 this.built = true; return this.doBuild(options, compilation, resolver, fs, function(err) { // 指定模塊引用,不經acorn解析 if(options.mole && options.mole.noParse) { if(Array.isArray(options.mole.noParse)) { if(options.mole.noParse.some(function(regExp) { return typeof regExp === "string" ? this.request.indexOf(regExp) === 0 : regExp.test(this.request); }, this)) return callback(); } else if(typeof options.mole.noParse === "string" ? this.request.indexOf(options.mole.noParse) === 0 : options.mole.noParse.test(this.request)) { return callback(); } } // 由acorn解析生成ast try { this.parser.parse(this._source.source(), { current: this, mole: this, compilation: compilation, options: options }); } catch(e) { var source = this._source.source(); this._source = null; return callback(new MoleParseError(this, source, e)); } return callback(); }.bind(this)); }; 對於每一個 mole ,它都會有這樣一個構建方法。當然,它還包括了從構建到輸出的一系列的有關 mole 生命周期的函數
Ⅶ webpack問題。。。,。。。,
webpack-dev-server有兩種推薦的用法
1、命令行方式。這個取決於你的webpack.config.js文件,然後調用「node_moles/.bin/webpack-dev-server」
2、npm script的方式。
可能你文件路徑或者調用命令行寫法有誤吧