如何使用 typescript 和 webpack 创建单页 Web 应用程序?

dis*_*ame 3 javascript node.js npm typescript webpack

一段时间以来,我一直在 Angular 中创建单页应用程序,现在我想创建一个单页应用程序,但不使用整个框架。

我想要一个 .html 文件和一个 javascript 文件,它们将被编译为打字稿文件,比如index.ts. 在里面index.ts我会从其他打字稿文件中导入东西。

网上是否有与我想要实现的项目类似的项目,是否有可能像这样设置 npm 项目?

编辑:

一段时间后,这就是我完成的:我的项目结构:

??? bundle.js
??? functions.ts
??? index.html
??? index.ts
??? package.json
??? style.css
??? tsconfig.json
??? webpack.config.js
Run Code Online (Sandbox Code Playgroud)

包.json

{
  "name": "rxjs6-demo",
  "version": "1.0.0",
  "main": "index.ts",
  "scripts": {
    "start": "webpack-dev-server --open"
  },
  "devDependencies": {
    "ts-loader": "^5.3.1",
    "typescript": "^3.2.2",
    "webpack": "^4.27.1",
    "webpack-cli": "^3.1.2",
    "webpack-dev-server": "^3.1.10"
  },
  "dependencies": {
    "rxjs": "^6.4.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

配置文件

{
    "compilerOptions": {
      "outDir": ".",
      "noImplicitAny": false,
      "sourceMap": true,
      "module": "es6",
      "target": "es6",
      "allowJs": true
    },
    "include": ["*.ts"],
    "exclude": []
}
Run Code Online (Sandbox Code Playgroud)

webpack.config.json

module.exports = {
  entry: './index.ts',
  output: {
    filename: 'bundle.js'
  },
  mode: 'development',
  devtool: 'inline-source-map',
  devServer: {
    contentBase: '.'
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/
      }
    ]
  },
  resolve: {
    extensions: [ '.tsx', '.ts', '.js' ]
  }
};
Run Code Online (Sandbox Code Playgroud)

索引.html

<html>
<head>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <script src="bundle.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

运行npm start将启动一个 webpack-dev-server,它会在每次任何 typescript 文件更改时重新编译我的应用程序。在 index.ts 中,我可以从其他 .ts 文件导入内容。但是我无法完成的是在 html 或 css 文件更改时让 webpack-dev-server 在浏览器中重新加载我的应用程序。

任何有关我的应用程序结构的帮助或一般建议将不胜感激。

Kir*_*kin 5

使用当前设置,Webpack 不会处理您的.html.css文件,因此它也不会监视它们的更改是有道理的。您可以指示 Webpack使用和处理文件,而不是link.html文件中为.css文件添加标签。.csscss-loaderstyle-loader

首先,您需要安装css-loaderstyle-loader. 例如:

npm i -D css-loader style-loader
Run Code Online (Sandbox Code Playgroud)

css-loader负责处理 CSS 文件并style-loader负责将它们注入到 DOM 中。使用这种方法时,输出bundle.js(在您的示例中)将包含转换后的 JavaScript 和 CSS,而 CSS 本身则包含在 JavaScript 和 DOM 操作中。

接下来,您需要将规则添加到webpack.config.js

{
    test: /\.css$/,
    use: ['style-loader', 'css-loader']
}
Run Code Online (Sandbox Code Playgroud)

这条规则,它位于中rules排列现有一起ts-loader规则,指示的WebPack工艺.css文件首先使用css-loader,然后style-loader

最后,您可以将导入添加到您的index.ts文件中:

import './style.css';
Run Code Online (Sandbox Code Playgroud)

这应该是 Webpack 开始处理和监视.css文件所需的全部内容。对于其他文件,您可以添加更多import如上所示的语句。

至于.html文件,有一个很好的答案是这里应该帮助。SurviveJS这里还有一本关于样式主题(以及您可能需要的几乎所有其他内容)的出色教程/在线书籍。这本书还涵盖了诸如为生产构建之类的内容,它允许将 CSS 内容提取到一个单独的文件中以用于生产构建等。