vue cli4.0项目引入typescript
<p> 现有的项目是采用vue cli4.0脚手架生成的,现在想要引入typescript。</p><p> 1.执行安装命令</p>
<div class="cnblogs_code">
<pre>npm install --save-<span style="color: rgba(0, 0, 0, 1)">dev typescript
npm install </span>--save-dev @vue/cli-plugin-typescript</pre>
</div>
<p> 2.根目录下新建 tsconfig.json</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span>"compilerOptions"<span style="color: rgba(0, 0, 0, 1)">: {
</span>"target": "esnext"<span style="color: rgba(0, 0, 0, 1)">,
</span>"module": "esnext"<span style="color: rgba(0, 0, 0, 1)">,
</span>"strict": <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"importHelpers": <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"moduleResolution": "node"<span style="color: rgba(0, 0, 0, 1)">,
</span>"experimentalDecorators": <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"esModuleInterop": <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"allowSyntheticDefaultImports": <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"sourceMap": <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"baseUrl": "."<span style="color: rgba(0, 0, 0, 1)">,
</span>"allowJs": <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"noEmit": <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"types": ["webpack-env"<span style="color: rgba(0, 0, 0, 1)">],
</span>"paths"<span style="color: rgba(0, 0, 0, 1)">: {
</span>"@/*": ["src/*"<span style="color: rgba(0, 0, 0, 1)">]
},
</span>"lib": ["esnext", "dom", "dom.iterable", "scripthost"<span style="color: rgba(0, 0, 0, 1)">]
},
</span>"exclude": ["node_modules"<span style="color: rgba(0, 0, 0, 1)">]
}</span></pre>
</div>
<p> 3.新增 shims-vue.d.ts<br>根目录下新建 shims-vue.d.ts,让 ts 识别 *.vue 文件,文件内容如下:</p>
<div class="cnblogs_code">
<pre>declare module '*.vue'<span style="color: rgba(0, 0, 0, 1)"> {
import Vue from </span>'vue'<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> Vue;
}</span></pre>
</div>
<p> 4.修改入口文件后缀</p>
<div class="cnblogs_code">
<pre>src/main.js => src/main.ts</pre>
</div>
<p> 5.改造 .vue 文件</p>
<p> <script>替换为<script lang="ts"></p>
<p> 加上 lang=ts 可以让webpack识别此段代码为 typescript</p>
<p> 6.使用装饰器插件</p>
<p> vue-class-component:强化 Vue 组件,使用 TypeScript装饰器 增强 Vue 组件,使得组件更加扁平化<br> vue-property-decorator:在 vue-class-component 上增强更多的结合 Vue 特性的装饰</p>
<p> Demo:</p>
<div class="cnblogs_code">
<pre>import { Vue, Component ,Watch} from 'vue-property-decorator'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
components: { Loading }
})
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class App extends Vue{
old_back:object</span>=<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,
transitionName:string </span>= "slide-right"<span style="color: rgba(0, 0, 0, 1)">;
get...mapState(</span>"base", ["loadingStatus"<span style="color: rgba(0, 0, 0, 1)">]);
@Watch(</span>'$route'<span style="color: rgba(0, 0, 0, 1)">)
onChangeValue(to:object, from:object){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log('$route', to, from)</span>
const noBack = to.meta.noBack; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">监听路由变化时的状态为前进还是后退</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 去终节点左,从终节点过来右</span>
<span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (to.meta.last) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.transitionName = "slide-left"<span style="color: rgba(0, 0, 0, 1)">;
} </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (from.meta.last) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.transitionName = "slide-right"<span style="color: rgba(0, 0, 0, 1)">;
} </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (from.meta.leaf) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 从其它叶子页面过来的,往右</span>
<span style="color: rgba(0, 0, 255, 1)">this</span>.transitionName = "slide-right"<span style="color: rgba(0, 0, 0, 1)">;
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (noBack) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 去到不需要返回的界面往右</span>
<span style="color: rgba(0, 0, 255, 1)">this</span>.transitionName = "slide-right"<span style="color: rgba(0, 0, 0, 1)">;
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.transitionName = "slide-left"<span style="color: rgba(0, 0, 0, 1)">;
}
}
}
@Watch(</span>'loadingStatus'<span style="color: rgba(0, 0, 0, 1)">)
onChangeValue(newVal: string){
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (newVal) {
setTimeout(_ </span>=><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.setLoading(<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
}, </span>1500<span style="color: rgba(0, 0, 0, 1)">);
}
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 弹出系统提示对话框</span>
<span style="color: rgba(0, 0, 0, 1)"> showAlert(msg:string) {
plus.nativeUI.alert(
msg,
</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log("User pressed!");</span>
<span style="color: rgba(0, 0, 0, 1)"> },
</span>"报警详情"<span style="color: rgba(0, 0, 0, 1)">,
</span>"确定"<span style="color: rgba(0, 0, 0, 1)">
);
}
}</span></pre>
</div>
<p>....</p>
</div>
<div id="MySignature" role="contentinfo">
<div align="left"><div style="color: #111111"><table style="vertical-align: top">
<tbody><tr>
<td id="tdSign">博客地址:</td><td>http://www.cnblogs.com/jiekzou/</td>
<td rowspan="2"></td>
</tr>
<tr>
<td>博客版权:</td><td>本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。<br>如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!<br>再次感谢您耐心的读完本篇文章。 </td>
</tr>
<tr><td>其它:</td><td>
.net-QQ群4:<span style="color: green">612347965</span>
java-QQ群:<span style="color: green">805741535</span>
H5-QQ群:<span style="color: green">773766020</span><br>
<div>我的拙作
《Vue3.x+TypeScript实践指南》
《ASP.NET MVC企业级实战》
《H5+移动应用实战开发》
《Vue.js 2.x实践指南》
《JavaScript实用教程 》
《Node+MongoDB+React 项目实战开发》
已经出版,希望大家多多支持!</div></td></tr>
</tbody></table></div>
</div>
<p style=" margin-bottom:-13px;padding-top: 15px;"><img src="https://images.cnblogs.com/cnblogs_com/jiekzou/780174/t_240929014358_%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20240929094331.png" style=" border:2px solid #ddd;border-radius:20px;" height="326" width="235"></p><br><br>
来源:https://www.cnblogs.com/jiekzou/p/13328675.html
頁:
[1]